【发布时间】:2013-08-06 11:53:20
【问题描述】:
我可以吗:
var foo = new Foo;
与:
var Foo = { prototype : { } };
就像我会做的那样:
var Foo = function() { };
?
感谢您的帮助。
【问题讨论】:
-
hmm 这背后有什么问题吗?
标签: javascript class function object prototype
我可以吗:
var foo = new Foo;
与:
var Foo = { prototype : { } };
就像我会做的那样:
var Foo = function() { };
?
感谢您的帮助。
【问题讨论】:
标签: javascript class function object prototype
不,你不能。
重点是prototype 属性是构造函数的属性,在本例中为Foo。如果您使用文字语法创建对象,例如
var foo = { prototype: {} };
您将属性分配给对象,而不是构造函数。
这是一个区别,因此在使用这种文字语法时,对原型对象的自动查找将不起作用。
如果您想使用原型,您必须使用如下构造函数语法:
var Foo = function () {};
Foo.prototype.foo = 'bar';
var foo = new Foo();
console.log(foo.foo); // => 'bar'
正如 cmets 中所讨论的,如果您尝试以文字语法将 constructor 属性分配给对象,它也不起作用:它再次仅在使用 true 原型设计时起作用。
希望这会有所帮助。
【讨论】:
没有。 new operator 之后的值必须是可构造的(带有[[construct]] 的对象),就像函数一样。您不能使用任意对象。
要从任意对象继承,请使用Object.create:
var fooProto = { … };
var foo = Object.create(fooProto);
【讨论】:
没有。 如
var Foo = { prototype : { } };
Foo 是一个对象而不是一个函数。您只能在 function
上执行“new”【讨论】:
不,ìn new X X 必须计算为函数。
感谢您的回答。我可以手动将它添加到构造函数中吗? 喜欢:{构造函数:{原型:{}}};我不需要这样做 只是想了解机制。
机制是它必须是一个函数,.constructor 或.prototype 属性根本不重要,实际上你可以new X 即使你delete .prototype 属性X - 你真正需要的只是让X 成为一个函数。
【讨论】:
小提示:
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
【讨论】: