我怎么知道原型链何时结束?

How do I know when the prototype chain ends?

在第一种情况下,原型链比第二种情况长。

function Func() {};
Func.__proto__ == Function.prototype; //true
Func.__proto__.__proto__ == Object.prototype; //true
Func.__proto__.__proto__.__proto__ == Object.prototype; //false
Func.__proto__.__proto__.__proto__.__proto__ == Object.prototype; //Cannot read property '__proto__' of null

在第二种情况下,它更短。

let obj = {};
    obj.__proto__ == Object.prototype; //true
    obj.__proto__.__proto__ == Object.prototype; //false
    obj.__proto__.__proto__.__proto__ == Object.prototype; //Cannot read property '__proto__' of null

为什么?第二个示例的行 obj .__ proto __.__ proto__ == Object.prototype 给出 false。但在第一种情况下,类似的代码行 Func .__ proto __.__ proto__ == Object.prototype 给出 true.

有什么区别?为什么第一个例子的原型链比第二个例子长?它取决于什么?

What's the difference? Why does the first example have longer prototype chain than the second one? What does it depend on?

只是第一个例子是一个函数,所以它有Function.prototype作为它的直接原型。第二个例子不是这种情况,它没有任何特殊的“子类型”所以直接委托给 Object.prototype.

函数也是 Javascript 中的对象。将其视为级别,它们在 chain/tree.

中比 Object 低一级

因此,如果定义了任何函数,其 __proto__ 将是 Function.prototype。 Function.prototype 的 __proto__ 将是 Object.prototype

注意:当我们执行 let obj ={} 时,在幕后 obj 被创建为 Object 的实例。 Object 的任何实例都将其 __proto__ 设置为 Object.prototype.

How do I know when the prototype chain ends?

当你递归请求 Object.getPrototypeOf(foo)(或 foo.__proto__)并且答案最终返回时,你知道原型链何时结束 null.

原型链可以是任意长度。你可以有一个 object 和一个原型 Sailboat.prototype,原型 Boat.prototype 有原型 Vehicle.prototype,原型 Mappable.prototype 有原型 Object.prototype。这是一组非常合理的原型关系,如果您想要更具体类型的帆船,您也可以在它的开头添加其他内容,例如 Catamaran.prototype 其原型为 Sailboat.prototype.

在这种情况下,函数 object 具有原型 Function.prototype,它具有原型 Object.prototype。由 {} 文字创建的 object 具有 Object.prototype 的原型。在这两种情况下,Object.prototype 都没有 parent;它是两条链的根,所以 Object.prototype.__proto__null.

说起来是同义反复,但是一个原型链就是这么长。你可以一直得到原型 parents 直到你不能了,这就是原型链的长度。