【问题标题】:Using new on an anonymous object with a prototype property?在具有原型属性的匿名对象上使用 new?
【发布时间】:2013-08-06 11:53:20
【问题描述】:

我可以吗:

var foo = new Foo;

与:

var Foo = { prototype : { } };

就像我会做的那样:

var Foo = function() { };

?

感谢您的帮助。

【问题讨论】:

  • hmm 这背后有什么问题吗?

标签: javascript class function object prototype


【解决方案1】:

不,你不能。

重点是prototype 属性是构造函数的属性,在本例中为Foo。如果您使用文字语法创建对象,例如

var foo = { prototype: {} };

您将属性分配给对象,而不是构造函数。

这是一个区别,因此在使用这种文字语法时,对原型对象的自动查找将不起作用。

如果您想使用原型,您必须使用如下构造函数语法:

var Foo = function () {};
Foo.prototype.foo = 'bar';

var foo = new Foo();
console.log(foo.foo); // => 'bar'

正如 cmets 中所讨论的,如果您尝试以文字语法将 constructor 属性分配给对象,它也不起作用:它再次仅在使用 true 原型设计时起作用。

希望这会有所帮助。

【讨论】:

  • 感谢您的回答。我可以手动将它添加到构造函数中,例如:{构造函数:{原型:{}}};我不需要这样做,只是想了解机制。
  • 我不知道,因为我没有尝试过,但您可以自己轻松检查;-)。 PS:刚试过,不行,不行。
  • 好吧,我只是以为有人知道:P
  • 相应地更新了我的答案... :-)
  • PS:如果这个答案回答了你的问题,如果你能把它标记为答案就好了;-)
【解决方案2】:

没有。 new operator 之后的值必须是可构造的(带有[[construct]] 的对象),就像函数一样。您不能使用任意对象。

要从任意对象继承,请使用Object.create

var fooProto = { … };

var foo = Object.create(fooProto);

【讨论】:

    【解决方案3】:

    没有。

    var Foo = { prototype : { } };
    

    Foo 是一个对象而不是一个函数。您只能在 function

    上执行“new”

    【讨论】:

    • 感谢您的帮助。
    【解决方案4】:

    不,ìn new X X 必须计算为函数。

    感谢您的回答。我可以手动将它添加到构造函数中吗? 喜欢:{构造函数:{原型:{}}};我不需要这样做 只是想了解机制。

    机制是它必须是一个函数,.constructor.prototype 属性根本不重要,实际上你可以new X 即使你delete .prototype 属性X - 你真正需要的只是让X 成为一个函数。

    【讨论】:

      【解决方案5】:

      小提示:

      function Fun() {};
      
      var anonym = {};
      var fun = new Fun;
      
      anonym.prototype.p = function() {};
      Fun.prototype.p = function(){};
      
      'p' in anonym;  // false  
      'p' in fun;     // true  (engine looks for properties in constructor's prototype object)
      
      anonym.constructor.prototype.p = function() {};
      'p' in anonym;  // true
      

      【讨论】:

        猜你喜欢
        • 2015-06-07
        • 1970-01-01
        • 2013-09-26
        • 1970-01-01
        • 1970-01-01
        • 2018-07-04
        • 2011-12-17
        • 2011-10-14
        • 2013-04-21
        相关资源
        最近更新 更多