0

私は、ダグラス・クロックフォードの「Javascript:The Good Parts」の本を使用して、初めてJavaScriptを学ぶ経験豊富なコーダーです。その中で、彼は次の関数を使用して、継承に「純粋にプロトタイプの」アプローチを使用することを推奨しています。

if (typeof Object.create !== 'function') {
    Object.create = function(o) {
        var F = function () {};
        F.prototype = o;
        return new F();
    };
}

私が抱えている問題は、オブジェクトが単純な型ではなくオブジェクトであるプロパティを持っている場合、新しいオブジェクトを作成すると、新しいオブジェクトを作成するのではなく、そのオブジェクトの親のインスタンスを継承することです。例えば:

var aBody = {
    arms : 2,
    legs : 2
};

var person = {
    name : 'Jeff',
    body : Object.create(aBody)
};
document.writeln('Person '+person.name+' has '+person.body.arms+' arms and '+person.body.legs+' legs.');

var cat = Object.create(person);
cat.name = 'Bob';
cat.body.arms = 0;
cat.body.legs = 0;

document.writeln('Cat '+cat.name+' has '+cat.body.arms+' arms and '+cat.body.legs+' legs.');
document.writeln('Now person '+person.name+' has '+person.body.arms+' arms and '+person.body.legs+' legs.');

これは出力を持っています:

Person Jeff has 2 arms and 2 legs.
Cat Bob has 0 arms and 0 legs.
Now person Jeff has 0 arms and 0 legs.

単純な「name」プロパティでは期待される動作が得られますが、「body」では得られません。私は理解していると思います-JavaScriptは参照によってコピーしているため、aBodyの新しいインスタンスは生成されません。personたとえば、からオブジェクトを作成するたびに手動でこれを行うことができましたcat.body = Object.create(aBody)が、これを元のオブジェクト定義にロールインするための適切な方法を見つけることができませんでした(ここでは、person)。

私は、すてきで、明確で、信頼できるJSコードを書くことを学ぼうとしているので、あなたが提供できるどんなガイダンスにも本当に感謝します。「純粋にプロトタイプの」アプローチを使用している人々がこの問題を処理するために持っている巧妙な技術はありますか?

4

1 に答える 1

1

プロトタイプ オブジェクトの要点は、クラス グローバル プロパティを格納する場所を提供することです。したがって、あなたが見ている動作は、実際にはプロトタイプの継承がサポートすることを意図した機能です。

インスタンスでプロパティを共有したくない場合は、プロパティをインスタンスに直接配置します。

Crock の関数を一般化して、初期化方法をチェックします。

if (typeof Object.create !== 'function') {
    Object.create = function(o) {
        var F = function () {};
        F.prototype = o;
        var obj = new F();
        if (o.init && typeof o.init === 'function')
          o.init.call(obj);
        return obj;
    };
}

いいえ、「aBody」を変更することはできません:

var aBody = {
  init: function() {
    this.body = { arms: 2, legs: 2 };
  }
};

それを使用してインスタンスを作成すると、独自の「body」プロパティが作成されます。

于 2011-10-07T13:13:38.410 に答える