TL;DR:
プロトタイプの OO にファクトリ/コンストラクタが必要ですか? パラダイム スイッチを作成して、それらを完全にドロップできますか?
バックストーリー:
私は最近、JavaScript でプロトタイプの OO をいじっていましたが、JavaScript で行われた OO の 99% は、古典的な OO パターンをそれに強制していることに気付きました。
典型的な OO に対する私の見解は、それには 2 つのことが関係しているということです。メソッド (および静的データ) の静的プロトタイプとデータ バインディング。ファクトリやコンストラクタは必要ありません。
JavaScript では、これらは関数と を含むオブジェクト リテラルObject.create
です。
これは、すべてを静的な設計図/プロトタイプとしてモデル化し、できればドキュメント スタイルのデータベースに直接フックされるデータ バインディングの抽象化を行えることを意味します。つまり、オブジェクトはデータベースから取り出され、プロトタイプをデータで複製することによって作成されます。これは、コンストラクターロジック、ファクトリー、no がないことを意味しnew
ます。
サンプルコード:
疑似例は次のとおりです。
var Entity = Object.create(EventEmitter, {
addComponent: {
value: function _addComponent(component) {
if (this[component.type] !== undefined) {
this.removeComponent(this[component.type]);
}
_.each(_.functions(component), (function _bind(f) {
component[f] = component[f].bind(this);
}).bind(this));
component.bindEvents();
Object.defineProperty(this, component.type, {
value: component,
configurable: true
});
this.emit("component:add", this, component);
}
},
removeComponent: {
value: function _removeComponent(component) {
component = component.type || component;
delete this[component];
this.emit("component:remove", this, component);
}
}
}
var entity = Object.create(Entity, toProperties(jsonStore.get(id)))
マイナーな説明:
ES5 は冗長であるため、特定のコードは冗長です。Entity
上記は設計図/プロトタイプです。データを持つ実際のオブジェクトは、 を使用して作成されObject.create(Entity, {...})
ます。
実際のデータ (この場合はコンポーネント) は、JSON ストアから直接読み込まれ、呼び出しに直接挿入されObject.create
ます。もちろん、コンポーネントの作成にも同様のパターンが適用され、合格したプロパティのみObject.hasOwnProperty
がデータベースに保存されます。
エンティティが初めて作成されるとき、それは空で作成されます{}
実際の質問:
今、私の実際の質問は
- JSプロトタイプOOのオープンソースの例?
- これは良い考えですか?
- 原型的な OOP の背後にあるアイデアや概念と一致していますか?
- コンストラクター/ファクトリー関数を使用しても、どこかでお尻を噛むことはありませんか? コンストラクタを使わなくても本当にうまくいくでしょうか。上記の方法論を使用して、それらを克服するために工場が必要な制限はありますか?