我一直在使用这种方法:
var __foo = new function(){
var _id = null;
function GetId(){
return _id;
}
function SetId(id){
_id = id;
}
return{
GetId : GetId,
SetId : SetId,
};
}
var __fooFactory = function(){
var _foos = [];
var _autoIncFooId = 0;
function CreateFoo(){
var newFoo = new __foo();
newFoo.SetId(_autoIncFooId++);
_foos.push(newFoo);
}
return{
CreateFoo : CreateFoo
};
}
我应该更多地使用原型而不是这个实现吗?这种方法有替代方案吗? (我对jQuery的想法持开放态度,但如果是这样,请将它们保留为1.4.4或注意版本合规性)
答案 0 :(得分:2)
Foo构造函数:
function Foo(i) {
var id = i; // private
this.getId = function () {
return id;
};
this.setId = function (i) {
id = i;
};
}
工厂构造函数:
function FooFactory() {
var i = 0,
foos = [];
this.createFoo = function () {
var foo = new Foo(i++);
foos.push(foo);
return foo;
};
}
用法:
var fooFactory0 = new FooFactory(),
foo00 = fooFactory0.createFoo(), // getId() -> 0
foo01 = fooFactory0.createFoo(); // getId() -> 1
var fooFactory1 = new FooFactory(),
foo10 = fooFactory1.createFoo(), // getId() -> 0
foo11 = fooFactory1.createFoo(); // getId() -> 1
如果您想要公开id
,可以使用原型:
function Foo(i) {
this.id = i; // public
}
Foo.prototype.getId = function () {
return this.id;
};
Foo.prototype.setId = function (i) {
this.id = i;
};
Crockford对var Foo = new function () { .. }所说的话。
将
new
直接放在function
前面绝不是一个好主意。例如,new function
在构造新对象方面没有任何优势。通过使用new
来调用函数,该对象保留在一个毫无价值的原型对象上。这会浪费记忆而没有抵消优势。