我可不可以做 :
var foo = new Foo;
和 :
var Foo = { prototype : { } };
就像我会做的那样:
var Foo = function() { };
?
谢谢你的帮助。
我可不可以做 :
var foo = new Foo;
和 :
var Foo = { prototype : { } };
就像我会做的那样:
var Foo = function() { };
?
谢谢你的帮助。
不,你不能。
关键是该prototype
属性是构造函数的属性,在这种情况下是Foo
. 如果您使用文字语法创建对象,例如
var foo = { prototype: {} };
您将属性分配给对象,而不是构造函数。
这是一个区别,因此在使用这种文字语法时,对原型对象的自动查找将不起作用。
如果要使用原型,则必须使用构造函数语法,如下所示:
var Foo = function () {};
Foo.prototype.foo = 'bar';
var foo = new Foo();
console.log(foo.foo); // => 'bar'
正如评论中所讨论的,如果您尝试以文字语法将属性分配给对象,它也不起作用constructor
:它再次仅在使用真正的原型设计时才起作用。
希望这可以帮助。
new
不,运算符后面的值必须是可构造的(带有 的对象[[construct]]
),就像函数一样。您不能使用任意对象。
要从任意对象继承,请使用Object.create
:
var fooProto = { … };
var foo = Object.create(fooProto);
不,ìnnew X
X
必须计算为函数。
感谢您的回答。我可以手动将它添加到构造函数中,例如:{构造函数:{原型:{}}};我不需要这样做,只是想了解机制。
机制是它必须是一个函数,.constructor
或者.prototype
属性根本不重要,事实上你可以,new X
即使你delete
的.prototype
属性X
——你真正需要的只是X
成为一个函数。
不。 如在
var Foo = { prototype : { } };
Foo 是一个对象而不是一个函数。你只能在功能上做“新”
小提示:
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