0

私はこのアプローチを使用しています:

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 に保つか、バージョンの準拠に注意してください)

4

1 に答える 1

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がvarFoo = new function(){..}について言っていること。

newの前に直接置くことは決して良い考えではありませんfunction。たとえば、new function新しいオブジェクトを作成する上で利点はありません。を使用newして関数を呼び出すことにより、オブジェクトは価値のないプロトタイプオブジェクトを保持します。これは、オフセットの利点なしにメモリを浪費します。

于 2012-05-31T22:25:58.377 に答える