Javascript 为什么手动初始化为null的原型仍然从对象继承

Javascript 为什么手动初始化为null的原型仍然从对象继承,javascript,prototype-programming,Javascript,Prototype Programming,如果我写这个 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那样从零继承。提前感谢:-)当您这样实例化它时,它将返回一个对象o 它的(隐藏的

如果我写这个

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那样从零继承。提前感谢:-)

当您这样实例化它时,它将返回一个对象
o

它的(隐藏的)原型链仍然指向
对象


简单地说,如果构造函数的原型不是对象,那么实例将被指定为Object.prototype作为它们的[[prototype]]

详情见ECMA-262,§13.2.2[[结构]:

当[[Construct]]内部方法 对于函数对象,用 参数列表可能为空, 采取以下步骤:

  • 让obj成为新创建的本机ECMAScript对象
  • 按照8.12的规定设置obj的所有内部方法
  • 将obj的[[Class]]内部属性设置为“对象”
  • 将obj的[[Extensible]]内部属性设置为true
  • proto是调用F的[[Get]]内部属性的值 带有参数“prototype
  • 如果Type(proto)是Object,则设置obj的[[Prototype]]内部属性 到原型
  • 如果Type(proto)不是Object,则设置的[[Prototype]]内部属性 obj到标准内置对象 如中所述的原型对象 15.2.4
  • 让result作为调用[[Call]]内部属性的结果 对于F,提供obj作为该值 并提供传递的参数列表 将[[Construct]]转换为参数
  • 如果类型(结果)是对象,则返回结果
  • 返回obj

  • 注意,在第6项和第7项中,
    null
    为null类型(ECMA-262§8.2),它与
    typeof null
    不同,这就是对象。

    所以我猜区别在于create函数创建了一个对象的字面等价物?但函数总是会创建一个对象,不管对象固有什么?@rubixibuc a
    函数在JavaScript中总是一个
    对象。rubixibuc-如果将构造函数的原型设置为非类型(Object),那么它构造的实例的[[prototype]]将是Object.prototype。@RobG这很奇怪,因为我发现浏览器错误地说
    typeof null==“Object”