我可以这样做:
var foo = new Foo;
with:
var Foo = { prototype : { } };
正如我所做的那样:
var Foo = function() { };
感谢您的帮助。
答案 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