javascript如何知道它已经到达__proto__查找链的末尾

时间:2016-08-20 07:49:31

标签: javascript prototype

我正在阅读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所以我不确定。那。我想知道这个查找是如何结束的。

提前感谢。

1 个答案:

答案 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);