我怎么知道原型链何时结束?
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 直到你不能了,这就是原型链的长度。
在第一种情况下,原型链比第二种情况长。
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 直到你不能了,这就是原型链的长度。