这是我参与8月更文挑战的第二十九天,活动详情查看:8月更文挑战
[Prototype]
JavaScript中的对象都有一个特殊的[prototype]内置属性,其实就是对于其他对象的引用。几乎所有的对象在创建时[prototype]都会被赋予一个非空的值。 [prototype]有什么用呢?当我们试图引用对象的属性时会触发[Get]操作,对于默认的[Get]来说,第一步是检查对象本身是否有这个属性,如果有就使用本身的属性,如果对象本身没有呢?那么就会使用对象的[prototype]链了。(这里讨论的情况不含ES6的Proxy)
var anotherObj={
a : 2
};
//创建一个关联到anotherObj的对象
var myObj = Object.create(anotherObj);
console.log(myObj.a); //2
myObj对象的[prototype]关联到了anotherObj。显然在myObj中,并不存在a,但是属性访问时,仍然成功的在anotherObj中找到了2。这个过程会持续找到匹配的属性名或者查找完整条[prototype]链,如果整条都没找到,就会返回undefined。
使用for...in遍历对象时原理和查找[prototype]链相似,任何可以通过原型链访问到(并且为enumerable)的属性都会被枚举。使用in操作符来检查属性在对象中是否存在时,同样的会去查找对象的整条原型链(无论属性是否可被枚举)。
var anotherObj={
a : 2
};
//创建一个关联到anotherObj的对象
var myObj = Object.create(anotherObj);
for (var k in myObj){
console.log("found:" + k);
}
//found: a
console.log("a" in my Obj)//true
当使用各种语法进行属性查找时,都会查找原型链,知道找到属性或者找完整条原型链。那么哪里是[prototype]链的尽头呢?
所有普通的[prototype]链最终都会指向内置的Object.prototype。由于所有的“普通”对象都“源于”Object.prototype对象,所有它包含很多JavaScript中通用的功能。比如.toString()和.valueof(),还有hasOwnProperty()和isPrototypeOf()等等。