为什么手动初始化为null的原型仍然从对象继承
-
22-10-2019 - |
题
如果我写这个
var o = Object.create(null)
alert(o instanceof Object) // this is false
最终如何成为真实
function o() {
}
o.prototype = null
alert(new o() instanceof Object) // this is true
不应手动将原型设置为无效,因为它像object。提前致谢 :-)
解决方案
简而言之,如果构造函数的原型不是对象,则给出实例 Object.Prototype 作为他们的[[原型]]。
细节在ECMA-262,第13.2.2节[[construct]]中:
当函数对象f的[[构造]]内部方法使用可能空的参数列表调用时,采取以下步骤:
- 让 OBJ 成为新创建的本机ecmascript对象。
- 设置所有内部方法 OBJ 如8.12所示。
- 设置[[class]]的内部属性 OBJ 至 ”目的".
- 设置[[扩展]]的内部属性 OBJ 至 真的.
- 让 原始 成为将[[get]]的内部属性称为参数的价值”原型".
- 如果类型(原始)是对象,设置[[原型]]的内部属性 OBJ至 原始.
- 如果类型(原始)不是对象,设置[[原型]]的内部属性 OBJ 如15.2.4所述,到标准内置对象原型对象。
- 让 结果 是调用[[呼叫]]内部属性的结果 F, ,提供 OBJ 作为 这个 价值并提供参数列表将[[构造]]作为 args.
- 如果类型(结果)是对象然后返回 结果.
- 返回 OBJ.
注意到第6和7项中 null
是null类型(ECMA-262§8.2),与 typeof null
, ,那是 目的.
其他提示
当您这样实例化时,它将返回 o
.
它(隐藏的)原型链 仍然 指着 Object
不隶属于 StackOverflow