[解決済み] カイル・シンプソンのOLOOパターンとプロトタイプデザインパターン
質問
Kyle Simpson の "OLOO (Objects Linking to Other Objects) Pattern" は、Prototype デザイン パターンと何か違いがあるのでしょうか。具体的には、quot;linking" (prototype の動作) を示す何かによってそれを造語し、ここで起こる "copying" (クラスの動作) がないことを明確にする以外に、彼のパターンは正確に何を導入しますか。
以下は Kyle のパターンの例です。 を彼の著書「JSを知らないあなたへ: This & Object Prototypes"」から引用しています。
var Foo = {
init: function(who) {
this.me = who;
},
identify: function() {
return "I am " + this.me;
}
};
var Bar = Object.create(Foo);
Bar.speak = function() {
alert("Hello, " + this.identify() + ".");
};
var b1 = Object.create(Bar);
b1.init("b1");
var b2 = Object.create(Bar);
b2.init("b2");
b1.speak(); // alerts: "Hello, I am b1."
b2.speak(); // alerts: "Hello, I am b2."
どのように解決するのですか?
<ブロッククオート彼のパターンは、具体的に何を紹介しているのでしょうか?
OLOOはプロトタイプチェーンをそのまま受け入れ、リンクを得るために他の(IMOを混乱させる)セマンティクスを重ねる必要がありません。
つまり、これら 2 つのスニペットはまったく同じ結果をもたらしますが、そこに到達する方法は異なるのです。
コンストラクタのフォームです。
function Foo() {}
Foo.prototype.y = 11;
function Bar() {}
Bar.prototype = Object.create(Foo.prototype);
Bar.prototype.z = 31;
var x = new Bar();
x.y + x.z; // 42
OLOOフォームです。
var FooObj = { y: 11 };
var BarObj = Object.create(FooObj);
BarObj.z = 31;
var x = Object.create(BarObj);
x.y + x.z; // 42
どちらのスニペットでも
x
オブジェクトは
[[Prototype]]
-オブジェクトにリンクされている (
Bar.prototype
または
BarObj
) にリンクされ、さらにそのオブジェクトは3番目のオブジェクト (
Foo.prototype
または
FooObj
).
リレーションシップとデリゲーションは、スニペット間で同一です。メモリ使用量はスニペット間で同一です。多くの "children"を作成する機能(つまり
x1
を通して
x1000
など)はスニペット間で同一です。デリゲーションのパフォーマンス(
x.y
と
x.z
) はスニペット間で同一です。オブジェクト生成のパフォーマンス
は
はOLOOの方が遅いですが
というサニティチェックは
を確認すると、パフォーマンスの遅さは実際には問題ではないことがわかります。
OLOOが提供するのは、オブジェクトを表現して直接リンクする方が、コンストラクターを通して間接的にリンクするよりもずっとシンプルだということです。
new
のメカニズムを通して間接的にリンクするよりも、オブジェクトを表現して直接リンクする方がずっとシンプルだということです。後者はクラスに関するもののように装っていますが、実際には委譲を表現するためのひどい構文にすぎません (
のサイドノートです。
ES6 もそうです
class
の構文です!)。
OLOOは中抜きをしてるだけです。
以下は
別の比較
の
class
とOLOOの比較です。
関連
-
[解決済み] 静的クラスとシングルトンパターンの違い?
-
[解決済み] JavaScriptにおける__proto__ VS. prototype
-
[解決済み】関数型プログラミングはGoFデザインパターンに取って代わるか?
-
[解決済み】C++ シングルトンデザインパターン
-
[解決済み] Javascript / jQueryでAndroid端末を検出する。
-
[解決済み] ECMAScriptとは?
-
[解決済み] Promise : then vs then + catch [重複].
-
[解決済み] JavaScriptのArray.sort()メソッドでシャッフルするのは正しいのか?
-
[解決済み] JavaScriptの文字列プリミティブとStringオブジェクトの違いは何ですか?
-
[解決済み] Chrome拡張機能:popup.htmlを強制終了させる
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] チェックボックスが選択されているかどうかを確認するjQuery
-
[解決済み] Google maps API V3 - 同一地点に複数のマーカーを設置する。
-
[解決済み] javascriptで2つの数値を連結する方法は?
-
[解決済み] なぜ "use strict "はパフォーマンスを10倍向上させるのか?
-
[解決済み] 文字列が空白であるかどうかをチェックする
-
[解決済み] Javascript 空の配列の削減
-
[解決済み] TypeScriptプロジェクトで既存のC#クラス定義を再利用する方法
-
[解決済み] JavaScriptとLuaの微妙な違い [終了しました]
-
[解決済み] <ng-content>が空かどうかを確認する方法は?(これまでのAngular 2+で)
-
[解決済み] JavaScriptデータフォーマット/プリティプリンタ