私は他の誰かのJavaScriptコードをリファクタリングしています。
前:
function SomeObj(flag) {
var _private = true;
this.flag = (flag) ? true : false;
this.version="1.1 (prototype)";
if (!this._someProperty) this._init();
// leading underscore hints at what should be a 'private' to me
this.reset(); // assumes reset has been added...
}
SomeObj.prototype.reset = function() {
/* perform some actions */
}
/* UPDATE */
SomeObj.prototype.getPrivate = function() {
return _private; // will return undefined
}
/* ...several other functions appended via `prototype`...*/
後:
var SomeObj = function (flag) {
var _private = true;
this.flag = (flag) ? true : false;
this.version = "2.0 (constructor)";
this.reset = function () {
/* perform some actions */
};
/* UPDATE */
this.getPrivate = function() {
return _private; // will return true
}
/* other functions and function calls here */
}
私にとって、最初の例は、特により大きな文脈では、読みにくいように見えます。reset
プロパティを使用してこのようなメソッドを追加するとprototype
、おそらくスクリプトのどこでも発生する可能性があるため、制御がはるかに少ないように見えます。私のリファクタリングされたコード(上記の2番目の例)は、私には非常に見栄えがよく、自己完結型であるため読みやすくなっています。変数宣言である程度のプライバシーを確保しましたが、プロトタイプチェーンの可能性を失いました。
..。
質問:
prototype
まず、前述の方法で他に何を失ったのか、またはプロトタイプチェーンの損失に大きな影響があるのかどうかを知りたいと思います。この記事は6年前のものですが、prototype
プロパティの使用はクロージャパターンよりも大規模ではるかに効率的であると主張しています。上記の両方の例は、引き続き
new
オペレーターによってインスタンス化されます。どちらも「古典的な」コンストラクターです。最終的には、これからすべてのプロパティと関数がsとして宣言されているモデルに移行したいと思います。またvar
、必要なすべてのプロパティとメソッドを開くオブジェクトを返すことができる1つのメソッドを公開しています。プライベートなものへの特権(閉鎖による)。このようなもの:var SomeObj = (function () { /* all the stuff mentioned above, declared as 'private' `var`s */ /* UPDATE */ var getPrivate = function () { return private; } var expose = function (flag) { // just returns `flag` for now // but could expose other properties return { flag: flag || false, // flag from argument, or default value getPrivate: getPrivate } }; return { expose: expose } })(); // IIFE // instead of having to write `var whatever = new SomeObj(true);` use... var whatever = SomeObj.expose();
StackOverflowには、「プロトタイプとクロージャー」の質問に対処するためのいくつかの回答があります(たとえば、こことここ)。しかし、
prototype
プロパティと同様に、これに近づき、オペレーターから離れるnew
ことが、コードの効率と可能性の喪失(たとえばinstanceof
、失われる)にとって何を意味するのかに興味があります。new
とにかくプロトタイプの継承を使用しない場合、演算子を先に進めることで実際に何かを失うことはありますか?prototype
上記の詳細を求めていることを考えると、許可されている場合はより緩い質問です。new
閉鎖よりも多くの利点(あなたが考えているものは何でも)を備えた最も効率的な方法であるかどうか、ガイドラインやデザインはありますか?きちんとした方法でそれらを書くためのパターン?
..。
アップデート:
expose
は毎回新しいオブジェクトを返すので、ここでインスタンス化が発生することに注意してください。私が理解しているように、そのオブジェクトがSomeObj
クロージャーで宣言されたメソッドを参照している場合、それらはすべてのオブジェクトで同じメソッドです(上書きされない限り)。flag
変数(これを修正しました)の場合、これはの引数から継承するexpose
か、デフォルト値を設定するか、カプセル化された既存のメソッドまたはプロパティを再度参照することができます。したがって、オブジェクトが生成されるインスタンスがあり、ここでいくつかの継承(およびポリモーフィズム?)が行われています。
new
質問2を繰り返します。とにかくプロトタイプの継承を使用しない場合、演算子を先に進めることで実際に何かを失うのでしょうか。
これまでの回答に感謝します。これは私の質問を明確にするのに役立ちました。