什么方法最适合在javascript中实例化其他函数的函数?

时间:2012-05-31 19:49:19

标签: javascript jquery

我一直在使用这种方法:

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或注意版本合规性)

1 个答案:

答案 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来调用函数,该对象保留在一个毫无价值的原型对象上。这会浪费记忆而没有抵消优势。