これらの例は両方とも正しくありません。私はあなたが意味したと思います:
初め:
var SomeObject;
SomeObject = (function() {
function SomeObject() {
}
SomeObject.prototype.doSomething = function() {
};
SomeObject.prototype.doSomethingElse = function() {
};
return SomeObject;
})();
(無名関数の最後の戻り値、=
ではなくの使用:
、および関数の割り当てを完了するためのセミコロンに注意してください。)
またはおそらくあなたは意味しました:
function SomeObject() {
}
SomeObject.prototype.doSomething = function() {
};
SomeObject.prototype.doSomethingElse = function() {
};
(匿名の囲み機能はありません。)
2番:
function SomeObject() {
}
SomeObject.prototype = {
doSomething: function() {
},
doSomethingElse: function() {
}
};
(プロトタイプへの割り当ては関数の外部にあることに注意してください。ここSomeObject
では:
、オブジェクト初期化子の内部にあるため使用します。また;
、最後に割り当てステートメントを完了するためのがあります。)
私が正しければ、それらの間にほとんど違いはありません。どちらもSomeObject
コンストラクター関数を作成し、プロトタイプに無名関数を追加します。2番目のバージョンは、コンストラクター関数のプロトタイプを完全に新しいオブジェクト(私はお勧めしません)に置き換えます。最初のバージョンは、コンストラクター関数が既に持っているSomeObject
プロトタイプを拡張するだけです。SomeObject
より便利な形式は次のとおりです。
var SomeObject;
SomeObject = (function() {
function SomeObject() {
}
SomeObject.prototype.doSomething = doSomething;
function doSomething() {
}
SomeObject.prototype.doSomethingElse = doSomethingElse;
function doSomethingElse()
}
return SomeObject;
})();
そこで、割り当てられた名前doSomething
をdoSomethingElse
持つ関数があります。これは、デバッガーでコードをウォークスルーするときに役立ちます(呼び出しスタック、ブレークポイントのリストなどに表示されます)。すべてをラップする無名関数は、との名前がそれを囲む名前空間を汚染しないようにするためにあります。詳細:匿名匿名doSomething
doSomethingElse
私たちの何人かはそれをさらに進めます:
var SomeObject;
SomeObject = (function() {
var p = SomeObject.prototype;
function SomeObject() {
}
p.doSomething = SomeObject$doSomething;
function SomeObject$doSomething() {
}
p.doSomethingElse = SomeObject$doSomethingElse;
function SomeObject$doSomethingElse()
}
return SomeObject;
})();
...そのため、リストだけdoSomething
でなくSomeObject$doSomething
、も表示されます。それが邪魔になることもありますが、それはスタイルの選択です。(また、匿名関数を使用して、のエイリアスを囲み、SomeObject.prototype
入力を少なくすることに注意してください。)