私は、ダグラス・クロックフォードの「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コードを書くことを学ぼうとしているので、あなたが提供できるどんなガイダンスにも本当に感謝します。「純粋にプロトタイプの」アプローチを使用している人々がこの問題を処理するために持っている巧妙な技術はありますか?