原型和原型链
[[Prototype]] 机制就是指对象中的一个内部链接引用 另一个对象
原型:内置属性,所有的对象在创建时 Prototype属性都会被赋予一个非空的值。
原型链:如果调用myObject.a,但是 a 不在 myObject 中,就会访问对象的原型链。
如何解决:创建一个关联到 anotherObject 的对象,而这个对象有a属性
-
var myObject = Object.create( anotherObject );
如果anotherObject也不存在a,则顺着原型链继续查找;
如果查找完整条原型链都没有的话就返回undefined -
Object.setPrototypeOf( Bar.prototype, Foo.prototype );
原型链功能
原型链的尽头是Object.prototype 对象,该对象的功能:
.toString()
.valueOf(),
.hasOwnProperty(…)。
.isPrototypeOf(…),
修改属性值时发生的机制
A.myObject.foo = “bar”
B.Object.defineProperty(myObject,”foo”,{
value:”bar”,
writable: true,
configurable: true,
enumerable: true})
}
If(当前调用的对象myObject中包含的 foo 属性)
{
会屏蔽原型链上层的所有 foo 属性,因为 myObject.foo总是会选择原型链中最底层的 foo 属性
}
else //当前没有但上层有foo
{
If(foo !=只读)
{
在myObject中添加为新的属性(屏蔽属性)
}
else if(foo==只读)//可以通过B屏蔽上层foo,在myObject中添加为新的属性
{
Error
}
else if(foo==setter){//可以通过B屏蔽上层foo,在myObject中添加为新的属性
调用setter
}
}
//注意:myObject.a++; 隐式屏蔽!形成新的属性
.constructor
.constructor是函数声明时的默认属性,指向内置的object函数,不能被构造,不可枚举,可写,不安全,不要用
判断类的关系
对象和函数之间:
- instanceof 回答 的问题是:在 a 的整条 [[Prototype]] 链中是否有指向 Foo.prototype 的对象?
对象和对象之间
- isPrototypeOf(…) 回答的问题是:在 a 的整 条 [[Prototype]] 链中是否出现过 Foo.prototype ?
获取原型的方式
- Object.getPrototypeOf( a )(用于遍历原型链,类似于setter/getter)
Object.getPrototypeOf( a ) === Foo.prototype; // true - a.proto === Foo.prototype; // true
原型作用
备用对象调用关联对象的属性
- Proxy
- API设计的内部委托方式
var anotherObject = {
cool: function() {
console.log( “cool!” );
} };
var myObject = Object.create( anotherObject );
myObject.doCool = function() {
this.cool(); // 内部委托! };
myObject.doCool(); // “cool!”