qu上章提到过[[prototype]] chain, 本章详细分析

⚠️所有试图模仿类复制的行为,如上章提到的mixins的变种,完全规避了[[Prototype]] chain机制,本章会谈到这方面



[[Prototype]]

一个特别的内建属性。用于引用到其他对象。当对象创建后,会得到一个这个属性的非空值。

例子

var anotherObject = {
a: 2
}; // create an object linked to `anotherObject`
var myObject = Object.create( anotherObject ); myObject.a; //

如果请求的属性没有在myObject上直接找到,默认的[[Get]]操作会沿原型链的连接去找。

点击查看:([[Get]]内容)

Object.create(..)此时可以简单理解为它创建一个对象,并用[[Prototype]] 关联的我们指定的对象上。

  • 如果没有在anotherOject查找到对应属性名字,会继续沿着prototype查找,直到找到。
  • 如果prototype chain结束后仍没有找到,则返回 undefined

类似[[Prototype]] chain的查询方式,

如果你使用for.. in循环一个对象,任何通过它的原型链条被查到的属性都会进行相关运算(enumerable:true才会被循环侦测到)。

for (var k in myObject) {
console.log("found: " + k);
}
// found: a

如果你使用in操作符号来测试一个属性是否存在于一个对象, in会检查整个原型链条(不考虑enumerable)

"a" in myObject  // true

Object.prototype

这是一个原型链的最后端点! 内建的Object.prototype!

这个对象包括了大量普通的程序utilities用于全部JS。

所有正常的对象的原型链的终端都是它Object!

一些utilities,如.toString(),  .valueOf(), hasOwnPreperty(..), 之后还会用到.isPrototypeOf()

anotherObject.isPrototypeOf(myObject)
// true , 用于查看一个对象是否是另一个个对象的原型(这个对象在另一个对象的正上面)

Setting & Shadowing Properties(避免避免避免!!1)

第3章提到了属性的设置更复杂,默认调用[[Put]]操作,有一系列的步骤。(点击)

myObject.foo = "bar";

首先判断myObject自身是否有foo属性,