JavaScript継承(四)原型式継承

2603 ワード

プロトタイプによって、既存のオブジェクトに基づいて新しいオブジェクトを作成することができます.また、カスタムタイプを作成する必要はありません.
function object(o) {
    function F(){}
    F.prototype = o;
    return new F();
}
object()関数の内部では、まず一時的なコンストラクタを作成し、その後、このコンストラクタのプロトタイプとして伝来したオブジェクトを最後にこの一時的なタイプの新しい例を返しました.
var person = {
    name: "Bert",
    friends: ["Shelby", "Court", "Van"]
};

var anotherPerson = object(person);
anotherPerson.name = "Greg";
anotherPerson.friends.push("Rob");

var yetAnotherPerson = object(person);
yetAnotherPerson.name = "Linda";
yetAnotherPerson.friends.push("Barbie");

alert(person.friends); // Shelby,Court,Van,Rob,Barbie
alert(anotherPerson.friends); // Shelby,Court,Van,Rob,Barbie
alert(yetAnotherPerson.friends); // Shelby,Court,Van,Rob,Barbie
このような継承要求は、対象が別の対象となる基礎が必要です.このようなオブジェクトがあるなら、それをobject()関数に渡すことができます.そして、具体的な需要に応じて、デルタオブジェクトの甲乙を修正すればいいです.
上記の例のperson.friendsは、personだけでなく、anothersonとyetAnothersonによっても共有されます.
ECMAScript 5はObject.create()を追加することによりプロトタイプ継承を規範化した.この方法は2つのパラメータを受け入れる:新しいオブジェクトのプロトタイプを作用させるオブジェクトと新しいオブジェクトのために追加の属性を定義するオブジェクト.
Object.assign()方法はObject.creat()に基づいて実現しますか?ですから、かわいそうなIE 8は互換性がないです.ですから、IE 8で似たような方法をカスタマイズする必要があります.

var person = {
    name: "Bert",
    friends: ["Shelby", "Court", "Van"]
};

var anotherPerson = Object.create(person);
anotherPerson.name = "Greg";
anotherPerson.friends.push("Rob");

var yetAnotherPerson = Object.create(person);
yetAnotherPerson.name = "Linda";
yetAnotherPerson.friends.push("Barbie");

alert(person.friends); // Shelby,Court,Van,Rob,Barbie
alert(anotherPerson.friends); // Shelby,Court,Van,Rob,Barbie
alert(yetAnotherPerson.friends); // Shelby,Court,Van,Rob,Barbie
Object.creat()方法の第二のパラメータはObject.defineProperties()方法の第二のパラメータフォーマットと同じです.各属性は自分のディスクリプタによって定義されます.このように指定した属性はいずれも原型オブジェクト上の同名属性をカバーします.
var person = {
    name: "Bert",
    friends: ["Shelby", "Court", "Van"]
};

var anotherPerson = Object.create(person, {
    name: {
        value: "Greg"
    }
});

alert(anotherPerson.name); // "Greg"
Object.creat()メソッドをサポートするブラウザには、IE 9+、Firefox 4+、Safari 5+Opera 12+、Chromeがあります.
一つのオブジェクトを他のオブジェクトと同じように保存したい場合、原型式継承は完全に可能です.ただし、参照タイプの値を含む属性は常に対応する値を共有し、プロトタイプを使用するようになります.
Reduxを使ってReducerでObject.assign()の方法を使ってステージを再作成することを推奨しています.リターンズをサポートできる理由はプロトタイプの継承です.プロトタイプチェーンから前のステージの値に遡ってリターン機能ができますか?
Reduxの返品は牛に迫ると言いたいですが、よく分かりません.このように見ても実現できますよ.