在 JS OOP 中,constructor
和prototype
属性是不稳定的,因为在执行继承时它们没有为您设置。您应该手动设置/更改它们以实现继承。例如,请参阅本教程。
看起来您尝试攀登原型链的方式(通过遍历.constructor.prototype
)从未真正到达Object
顶级原型,因为当您拥有function a(){}
权限constructor
并且prototype
属性未设置在 a. 我什至无法强迫他们进入a
; 在 Chrome 中我得到:
> function a(){}
undefined
> a.constructor.prototype
function Empty() {}
> a.constructor.prototype = Object.prototype
Object
> a.constructor.prototype
function Empty() {} // hmmmm, the assignment didn't take...
当然,运行时不需要这样做,因为它引用了每个对象的实际原型。即语言不通过 进行查找,它在内部保存每个实例.constructor.prototype
的原型。所以你可以看到查找链是如何工作的,而不是你使用:.constructor.prototype
.__proto__
function a(){}
b = new a();
b.__proto__ === Object.prototype; // false
b.__proto__.__proto__ === Object.prototype; // true since we reached the top of the prototype chain
需要注意的是,该属性__proto__
从来都不是标准的,并且在 ES5 中以稍微不同的方式标准化:
obj.__proto__ === Object.getPrototypeOf(obj);
这会导致.__proto__
弃用。