为什么手动初始化为 null 的原型仍然继承自 Object

2023-11-29

如果我写这个

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 那样从任何东西继承。提前致谢 :-)


简而言之,如果构造函数的原型不是对象,则给出实例对象.原型作为他们的[[原型]]。

详细信息参见 ECMA-262,§13.2.2 [[Construct]]:

当[[Construct]]内部方法 对于一个 Function 对象 F 被调用 可能为空的参数列表, 采取了以下步骤:

  1. Let obj是新创建的本机 ECMAScript 对象。
  2. 设置所有内部方法obj如 8.12 中规定。
  3. 设置 [[Class]] 内部属性obj to "Object".
  4. 设置 [[Extensible]] 内部属性obj to true.
  5. Let proto是调用 F 的 [[Get]] 内部属性的值 与论证“原型".
  6. If Type(proto) 是 Object,设置 [[Prototype]] 内部属性obj to proto.
  7. If Type(proto) 不是 Object,设置 [[Prototype]] 内部属性obj到标准内置对象 原型对象,如中所述 15.2.4。
  8. Let result是调用 [[Call]] 内部属性的结果 的F,提供obj as the this价值 并提供传递的参数列表 进入 [[构造]] 作为args.
  9. If Type(result) 是 Object 然后返回result.
  10. Return obj.

注意到在第 6 项和第 7 项中,null类型为 null (ECMA-262 §8.2),它与typeof null,即object.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么手动初始化为 null 的原型仍然继承自 Object 的相关文章

随机推荐