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

时间:2011-06-10 00:43:19

标签: 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那样从中继承。在此先感谢: - )

2 个答案:

答案 0 :(得分:2)

简而言之,如果构造函数的原型不是Object,那么实例将被赋予 Object.prototype 作为[[prototype]]。

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

  

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

     
      
  1. obj 成为新创建的本机ECMAScript对象。
  2.   
  3. 按照8.12中的规定设置 obj 的所有内部方法。
  4.   
  5. obj 的[[Class]]内部属性设置为“对象”。
  6.   
  7. obj 的[[Extensible]]内部属性设置为 true
  8.   
  9. proto 成为调用F的[[Get]]内部属性的值   参数“原型”。
  10.   
  11. 如果Type( proto )是Object,设置 obj 的[[Prototype]]内部属性    proto
  12.   
  13. 如果Type( proto )不是Object,则设置[[Prototype]]的内部属性    obj 到标准的内置Object   原型对象如描述   15.2.4。
  14.   
  15. 结果成为调用[[Call]]内部属性的结果   of F ,提供 obj 作为值   并提供传递的参数列表   将[[Construct]]改为 args
  16.   
  17. 如果Type( result )是Object,则返回 result
  18.   
  19. 返回 obj
  20.   

注意到在第6和第7项中,null是Type null(ECMA-262§8.2),它与typeof null不同,后者是 object

答案 1 :(得分:1)

当你像这样实例化时,它返回一个o的对象。

其(隐藏)原型链仍然指向Object

Prototype