1. ホーム
  2. javascript

[解決済み] カイル・シンプソンのOLOOパターンとプロトタイプデザインパターン

2022-09-07 17:35:59

質問

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.yx.z ) はスニペット間で同一です。オブジェクト生成のパフォーマンス はOLOOの方が遅いですが というサニティチェックは を確認すると、パフォーマンスの遅さは実際には問題ではないことがわかります。

OLOOが提供するのは、オブジェクトを表現して直接リンクする方が、コンストラクターを通して間接的にリンクするよりもずっとシンプルだということです。 new のメカニズムを通して間接的にリンクするよりも、オブジェクトを表現して直接リンクする方がずっとシンプルだということです。後者はクラスに関するもののように装っていますが、実際には委譲を表現するためのひどい構文にすぎません ( のサイドノートです。 ES6 もそうです class の構文です!)。

OLOOは中抜きをしてるだけです。

以下は 別の比較 class とOLOOの比較です。