在具有prototype属性的匿名对象上使用new?

时间:2013-08-06 11:53:20

标签: javascript class function object prototype

我可以这样做:

var foo = new Foo;

with:

var Foo = { prototype : { } };

正如我所做的那样:

var Foo = function() { };

感谢您的帮助。

5 个答案:

答案 0 :(得分:5)

不,你不能。

关键是prototype属性是构造函数的属性,在本例中为Foo。如果使用文字语法(如

)创建对象
var foo = { prototype: {} };

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

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

如果您想使用原型, HAVE 使用构造函数语法,如下所示:

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

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

正如评论中所讨论的,如果您尝试使用文字语法为对象分配constructor属性,它也不起作用:它仅在使用 true 原型时才起作用。< / p>

希望这有帮助。

答案 1 :(得分:2)

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

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

var fooProto = { … };

var foo = Object.create(fooProto);

答案 2 :(得分:0)

不,“new X X必须评估为函数。

  

感谢您的回答。我可以手动将其添加到构造函数中,   喜欢:{constructor:{prototype:{}}};我不需要这样做,   只想了解机制。

机制是它必须是一个函数,.constructor.prototype属性根本不重要,即使你new X,你也可以delete .prototype的{​​{1}}属性 - 您需要的所有内容都是X成为一个函数。

答案 3 :(得分:0)

如在

var Foo = { prototype : { } };

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

上执行“新操作”

答案 4 :(得分:0)

小提示:

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