我正在阅读javascript中的 proto 链。我试图了解javascript如何知道它已经到达__proto__
链的末尾。实际上它将位于Object.prototype
指向的对象中。到目前为止,我已经掌握了以下内容,如果我错了,请纠正我。
每个构造函数都有一个名为prototype
的属性,它还有一个名为__proto__
的属性,默认情况下__proto__
指向Object.prototype
。但是,一旦使用new创建了对象的实例,则会为该实例的__proto__
属性分配一个新值ConstructorName.prototype
。现在在使用期间,在对象的本地范围内找不到属性。 Javascript查看__proto__
指向的对象内部,如果在那里找不到该对象,则它会查看该对象的__proto__
所指向的对象内部并继续进行。我现在的问题是,如果流程继续进行,似乎最终会在Object.prototype.
指向的对象内部结束这个Object.prototype
是否有__proto__
??我看着里面的铬,似乎它没有,但它有原子的getter和setter所以我不确定。那。我想知道这个查找是如何结束的。
提前感谢。
答案 0 :(得分:2)
以下两个表达式均为真:
console.log(Object.prototype.__proto__ === null);
console.log(Object.prototype.constructor === Object);
这意味着通过__proto__
的原型链在其值变为null
时结束。
然而,Object.prototype
的构造函数又是Object
,所以这真的是一个无限循环。当然,这只是它的实现方式,并不意味着Object.prototype
创建了new Object()
。
您还可以创建一个没有__proto__
的对象。这两个表达式都是正确的:
console.log(Object.create(null).__proto__ === undefined);
console.log(Object.create(null).constructor === undefined);
__proto__
:标准化和弃用一个不错的article on __proto__
提及:
由于
__proto__
受到如此广泛的支持,因此决定其行为应该针对ECMAScript 6进行标准化。但是,由于其存在问题,因此将其添加为已弃用的功能。
Object.getPrototypeOf()
要获取有关对象原型的信息,建议使用Object.getPrototypeOf(obj)
代替obj.__proto__
:
console.log(Object.getPrototypeOf({}) === Object.prototype);
console.log(Object.getPrototypeOf(Object.prototype) === null);
console.log(Object.getPrototypeOf(Object.create(null)) === null);