如何在构造函数的原型不是对象时创建对象?

时间:2017-01-25 08:22:18

标签: javascript object constructor prototype

我回答了这个问题:How do objects created? 但在我回答之后我也有一个问题。

function Bar() {
    this.foo = true;
}
console.log('obj3');
Bar.prototype = 3;
var obj3 = new Bar();
console.log(obj3);
console.log(obj3.constructor === Bar);
console.log(obj3.constructor === Object);
  
console.log(Object.prototype === Object.getPrototypeOf(obj3));
console.log(obj3.foo);

Bar.prototype = 3,我的理论是,当new Bar()执行时,如第2步,创建的对象应该链接到Bar.prototype,但是Bar.prototype的值不引用对象,隐式指定了默认值,即Object.prototype

由于object.prototype.constructor引用了Objectobj3.constructor也引用了Object,但obj3事实< / em>构造函数仍为Bar,因为第1步console.log(obj3.foo); // true也可以证明这一点。

我是对的吗?

@Leo问我是否可以提供有关内部机制的更多信息。他在Firefox Chrome Safari中对它进行了测试,它们的行为都相同,他认为它应该是ECMA-262中明确规定的内容。但是,他没有到正确的地方。但是我也找不到任何支持我的论点,因此我正在寻求你的帮助。您能否提供有关内部机制的更多信息?

1 个答案:

答案 0 :(得分:6)

是的,这是在GetPrototypeFromConstructor中指定的:

  
      
  1. proto 成为? Get构造函数"prototype")。
  2.   
  3. 如果Type proto )不是对象,那么

         
        
    1. 境界成为? GetFunctionRealm构造)。
    2.   
    3. proto 成为领域名为 intrinsicDefaultProto 的内在对象。
    4.   
  4.   

具体来说,它的工作原理如下:

  1. new Bar()来电Bar.[[Construct]]
  2. 使用
    初始化 thisArgument OrdinaryCreateFromConstructor newTarget "%ObjectPrototype%"
  3. 返回一个继承自
    的对象 GetPrototypeFromConstructor构造函数 intrinsicDefaultProto
  4. 因此,如果prototype不是对象,则默认值为该领域的%ObjectPrototype%。

    请注意,它并非总是Object.prototype

    var iframe = document.createElement('iframe');
    document.body.appendChild(iframe);
    var win = iframe.contentWindow;
    document.body.removeChild(iframe);
    var F = win.Function("")
    F.prototype = 5;
    var proto = Object.getPrototypeOf(new F());
    proto === Object.prototype; // false
    proto === win.Object.prototype; // true