如何解决为什么手动初始化为null的原型仍然继承自Object
| 如果我写这个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一样从任何内容继承。提前致谢 :-)
解决方法
简而言之,如果构造函数的原型不是Object,则实例将被赋予Object.prototype作为其[[prototype]]。
详细信息在ECMA-262,第13.2.2节[[Construct]]中:
当[[Construct]]内部方法
对于功能对象F的调用
可能是空的参数列表,
采取以下步骤:
令obj为新创建的本机ECMAScript对象。
按照8.12中的说明设置obj的所有内部方法。
将obj的[[Class]]内部属性设置为\“ Object \”。
将obj的[[Extensible]]内部属性设置为true。
令proto为调用F的[[Get]]内部属性的值
带有参数“原型”。
如果Type(proto)为Object,则设置obj的[[Prototype]]内部属性
证明。
如果Type(proto)不是Object,则设置的[[Prototype]]内部属性
obj到标准内置对象
如中所述的原型对象
15.2.4。
令result为调用[[Call]]内部属性的结果
F,提供obj作为此值
并提供传递的参数列表
进入[[Construct]]作为参数。
如果Type(result)为Object,则返回结果。
返回obj。
请注意,在第6项和第7项中,“ 2”为null类型(ECMA-262§8.2),它与作为对象的“ 3”不同。
, 像这样实例化它时,它返回一个对象
o
。
其(隐藏的)原型链仍然指向Object
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。