先补充下 __proto__ 和prototype的知识。
对象的内部原型( __proto__ )和构造器的原型(prototype)。
所有构造器/函数(包含自定义)的 __proto__ 都是指向Function.prototype这样一个空函数(typeof Function.prototype===’function’ ->true)的,而Math和JSON这样以对象形式存在的,他们的__proto__是Object.prototype.
继续深入有
|
|
,而
|
|
所有构造器的实例对象的 __proto__ 都是指向其构造器的 prototype。
看下面这个例子,
|
|
调试后可以看到这样的结果在scope中
|
|
可以看到O1、O6都是自带了__proto__属性的,O7是自定义null为prototype来创建对象,所以就没有此属性。
又__proto__是其构造器的prototype属性,故有,
|
|
详见JavaScript中proto与prototype的关系。
对象的直接属性和__proto__属性
修改构造器的prototype的属性或方法,其实例对象的__proto__依然恒等于构造器的prototype,两者指向同一个对象。
在查找对象属性的时候,顺序是
直接属性 -|-> __proto__属性,有则返回,无则深入。
在修改对象属性的时候,顺序是
直接属性 -|-| __proto__属性,只会修改直接属性,而不深入到__proto__这个继承自构造器的属性。
|
|