モジュールの複合を構築していますrequest
が、Node の JS でオブジェクトを構築する際のベスト プラクティスがわかりません。
オプション1:
function RequestComposite(request) {
return {
get: function (url) { return request.get(url); }
}
}
var comp = RequestComposite(request);
- 注: CB を非同期で呼び出す必要があることはわかっていますが、説明を簡単にするために返します...
オプション2:
function RequestComposite(request) {
this.request = request;
}
RequestComposite.prototype.get = function (url) { return this.request.get(url); };
var comp = new RequestComposite(request);
オプション3:
var RequestComposite = {
init: function (request) { this.request = request; },
get: function (url) { return request.get(url); }
}
var comp = Object.create(RequestComposite).init(request);
なんとか道を探そうとしましたが、オブジェクトの使い方がわからずさらに混乱してしまいました...
ブラウザ用のオブジェクトを使用する場合、答えは異なりますか?
ありがとう。
ベストアンサー1
最も効率的な方法は次のとおりです。
すべての重要な初期化をコンストラクターに配置します (例: コンストラクター パラメーターの検証、プロパティの設定など)。
コンストラクターのプロパティにメソッドを設定します
.prototype
。なぜでしょうか? これは、オブジェクトを作成するたびに各メソッドを再度書き直す必要がなくなるためです。 この方法では、作成するオブジェクトごとに同じプロトタイプを再利用します。 メモリが効率的に使用され、コーディング時間が節約されます。プライベートプロパティにはクロージャを使用しないでください。なぜでしょうか? 遅くなるだけでなく、継承チェーンでこのオブジェクトを使用できなくなります (疑似プライベート変数はオブジェクトに属しておらず、アクセス可能であるだけです)。代わりに、オブジェクトプロパティを宣言するときにアンダースコアを使用して、それがプライベートであることを示すのが一般的です。_プライベート外部からアクセスしてはならないプロパティ。
new
の代わりにを使用してくださいObject.create
。他の OOP 言語に慣れている場合は覚えやすくなります。最後に と が内部でnew
使用されています。Object.create
つまり、次のようになります。
var Person = function (name) {
this._name = name;
};
Person.prototype.sayHello = function () {
alert('My name is: ' + this._name);
};
var john = new Person('John');
john.sayHello();
編集
追加情報:
Object.create と new。ここでベンチマーク質問は Node.js に関するものですが、同じ動作が予想されると思います。(訂正があれば歓迎します)
プライベートプロパティをエミュレートするクロージャ: について読むことができますこの質問では。プライベート/クロージャ プロパティがオブジェクトに属していないという点はプログラミング上の事実です。つまり、オブジェクト メソッドからアクセスすることはできますが、オブジェクトに属しているわけではありません。継承を使用する場合、これは大きな問題になります。さらに、コンストラクターで宣言されたメソッドのみがクロージャにアクセスできます。プロトタイプで定義されたメソッドはアクセスできません。
編集 2016/04/15
3 年前にここで述べた点は、パフォーマンスの観点からは依然として正しいですが、「推奨される方法」についての私の意見は、その間に少し変わりました。ファクトリ関数は一般的に良い選択肢であり、OP の最初のアプローチになります。一例を挙げます。
function Person(name) {
return {
sayHello: function () { alert('My name is: ' + name); }
};
}
そして次のようにします:
var p = Person('John');
この場合、柔軟性 (new
結合なし、他の「ミックスイン」との合成の容易さ) と単純さ (this
混乱なし、オブジェクトのインスタンス化の容易さ) をいくらかの速度とメモリと引き換えます。一般的に、これらは完全に有効です。パフォーマンスの問題があり、それがこのオブジェクト作成方法によるものである場合は、別の方法に戻してください。このObject.create
アプローチも優れており、ファクトリ関数とファクトリ関数の中間にあたりますnew
(補足: 新しい構文は+class
の構文糖です)new
prototype
まとめると、私が推奨する方法は、オブジェクトを作成する最も単純で簡単な方法 (ファクトリ関数) から始めて、パフォーマンスの問題が発生した場合 (ほとんどの場合、パフォーマンスの問題は発生しません)、他の方法に切り替えることです。
2023年に編集
この回答を書いてから雨がたくさん降り、もはや関連性がなくなりました。ただ使用してclass
、実際の問題について心配してください。