js中每个对象都连接到一个原型对象,并且可以从中继承属性。所有通过对象字面量创建的对象都连接到Object.prototype。
当我们创建一个新对象时,可以通过Object.create()函数来创建一个使用原对象为其原型的新对象。
var a ={ name:"liu", nickname:"lh" } var anotherA = Object.create(a); anotherA.nickname = "chu"; for(var i in anotherA){ console.log(i+":"+anotherA[i]); }
发现输出的name与nickname顺序发生了改变
nickname:chu
name:liu
因此这也是我们不推荐使用for in的原因。因为输出的顺序是不定的。
然而,原型连接在更新时是不起作用的。当我们对新对象作出改变时,不会触及该对象的原型。当我们尝试去获取某个属性值,但改对象没有该属性,那么js会从原型对象中获取属性值。如果那个原型对象也没有该属性,那么就再去它的原型中寻找,直到终点Object.prototype为止。原型关系是一个动态关系,如果在对象创建之后再向原型对象添加属性,那么从该对象上仍然能访问到该属性。
a.age = "21"; anotherA.age;//21
为了判断该属性是不是对象独有的属性,可使用hasOwnProperty方法,hasOwnProperty不会检查原型链。
anotherA.hasOwnProperty("nickname");//true anotherA.hasOwnProperty("name");//false
我们可以通过delete来删除对象的属性。这样对象的属性就再次指向了原型对象的属性值。
delete anotherA.nickname;
anotherA.nickname;//"lh"