如果我写这个
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
不应手动将原型设置为null,因为它会像Object.create那样从中继承。在此先感谢: - )
答案 0 :(得分:2)
简而言之,如果构造函数的原型不是Object,那么实例将被赋予 Object.prototype 作为[[prototype]]。
详情见ECMA-262,§13.2.2[[Construct]]:
当[[Construct]]内部方法时 用于调用Function对象F 一个可能是空的参数列表, 采取以下步骤:
- 让 obj 成为新创建的本机ECMAScript对象。
- 按照8.12中的规定设置 obj 的所有内部方法。
- 将 obj 的[[Class]]内部属性设置为“对象”。
- 将 obj 的[[Extensible]]内部属性设置为 true 。
- 让 proto 成为调用F的[[Get]]内部属性的值 参数“原型”。
- 如果Type( proto )是Object,设置 obj 的[[Prototype]]内部属性 proto 。
- 如果Type( proto )不是Object,则设置[[Prototype]]的内部属性 obj 到标准的内置Object 原型对象如描述 15.2.4。
- 让结果成为调用[[Call]]内部属性的结果 of F ,提供 obj 作为此值 并提供传递的参数列表 将[[Construct]]改为 args 。
- 如果Type( result )是Object,则返回 result 。
- 返回 obj 。
醇>
注意到在第6和第7项中,null
是Type null(ECMA-262§8.2),它与typeof null
不同,后者是 object 。
答案 1 :(得分:1)
当你像这样实例化时,它返回一个o
的对象。
其(隐藏)原型链仍然指向Object