4

我可不可以做 :

var foo = new Foo;

和 :

var Foo = { prototype : { } };

就像我会做的那样:

var Foo = function() { };

?

谢谢你的帮助。

4

5 回答 5

5

不,你不能。

关键是该prototype属性是构造函数的属性,在这种情况下是Foo. 如果您使用文字语法创建对象,例如

var foo = { prototype: {} };

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

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

如果要使用原型,则必须使用构造函数语法,如下所示:

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

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

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

希望这可以帮助。

于 2013-08-06T11:55:31.230 回答
2

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

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

var fooProto = { … };

var foo = Object.create(fooProto);
于 2013-08-06T12:02:21.117 回答
0

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

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

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

于 2013-08-06T11:55:05.927 回答
0

不。 如在

var Foo = { prototype : { } };

Foo 是一个对象而不是一个函数。你只能在功能上做“新”

于 2013-08-06T11:58:19.047 回答
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
于 2017-01-31T12:49:52.663 回答