Object.getOwnPropertyNames()
方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性)组成的数组。
好吧返回结果是数组
把这个API,放在这里是因为它可以方便的观察对象的原型链的结构。这里对于原型链就不做笔记了
//创建一个构造函数
function P()
{
this.name="lishi";
this.age=18;
}
//给P这个构造函数指定一个原型对象
P.prototype={
get_age:function(){
console.log(this.age)
},
long:"1.4m",
menu:{
a:1,
b:2
}
}
//实例化对象
var p=new P();
//现在修改一个原型链上的属性值
p.long="2m";
console.log(p.long); //2m,事实证明是修改成功了的
//修改原型链对象上menu对象a属性的值
p.menu.a=3;
console.log(p.menu); //{a:3,b:2}
问题来了如果我再次实例化P,
1.直接输出原型链上long的值,是否发生变化
2.直接输出原型链上menu的值,是否发生变化
//1.测试
var o=new P();
console.log(o.long); //1.4m
结果是由p对象发起的修改原型链上的long属性值,会直接在p对象上添加或修改这个属性(已经存在的);并没有去作用到原型链中的属性值
//2.测试menu值
console.log(o.menu); //{a:3,b:2}
结果是由p对象发起的修改原型链上的menu属性,如果menu属性是一个对象等,会追根溯源到原型链上,修改后就会影响后面创建的实例对象引用
引用之前我看过的文章来总一下
修改这个对象的非引用属性会直接在对象上添加或修改这个属性(已经存在的)
修改引用属性如对象则会追根溯源到原型链上,修改后就会影响后面创建的实例对象。
因此如果有代码想要重复使用而不是要反复修改的属性,就写在原型上去继承,而表示特色的属性尤其是要经常修改的普通对象要写在构造函数上。