在javascript中有两种创建对象的方法:
第一个是,例如
FooType = function() {
this.hello = function() { alert("hello"); };
};
foo = new FooType();
foo.hello();
第二个是
fooFactory = function() {
return {
hello : function() { alert("hello"); }
};
};
foo = fooFactory();
foo.hello();
(为帖子编写的代码。不保证正确)
除了将此绑定到全局对象的错误风险之外,这两种方法完全等效(还考虑原型继承等)吗?
答案 0 :(得分:6)
它们并不等同,特别是在考虑原型继承时。
FooType = function() {
this.hello = function() { alert("hello"); };
};
var foo = new FooType();
FooType.prototype.bye = function() { alert('bye!'); };
foo.bye(); // "bye!"
你能以fooFactory的方式实现这一目标的唯一方法是将它添加到object
原型,这是一个非常糟糕的主意。
在我看来,第一种方法更有意义(因为对象具有可以检查的类型),并且如果原型正确完成,可以提供更好的性能。在第一个示例中,每次实例化一个新的FooType
对象时,它都会创建一个新的“hello”函数。如果你有很多这些对象,那就浪费了大量的内存。
请考虑改用:
function FooType() { }
FooType.prototype.hello = function() {
alert('Hello');
};
答案 1 :(得分:2)
在示例一中,foo
继承自FooType
的原型(未进行任何更改)。 foo instanceof FooType
在示例中是正确的。在示例二中,没有继承。如果您要重用方法,请使用示例1但在FooType.prototype
上定义共享方法,而不是在函数体中:
var FooType = function() {};
FooType.prototype.hello = function() { alert("hello"); };