JavaScriptにおける継承の原型式継承

2555 ワード

プロトタイプ継承の思想は、プロトタイプを借りることによって既存のオブジェクトに基づいて新しいオブジェクトを作成することができます.
この目的を達成するために、以下の関数が与えられます.
function object(o){
    function F(){}
    F.prototype = o;
    return new F();    
}
object()関数の内部では、まず一時的なコンストラクタを作成し、このコンストラクタのプロトタイプとして導入されたオブジェクトを作り、最後にこの関数の新しい例を返します.はっきり言えば、入ってきたオブジェクトに対して浅いコピーを実行するということです.つまり、新しいオブジェクトを作成しようとしているプロトタイプのオブジェクトに、導入されたオブジェクトの実例的な属性と実例的な方法をコピーするということです.
function object(o){
     function F(){}
     F.prototype = o;
     return new F();
     }

    var person = {
        name: "Nico",
        friends: ["Shlby","huu","dima"]
    };

    var anotherPerson = object(person);
    //var anotherPerson = Object.create(person);
    anotherPerson.name = "Greg";  //                      
    anotherPerson.friends.push("rob");

    var yetanotherPerson = object(person); 
   // var yetanotherPerson = Object.create(person);
    yetanotherPerson.name = "Linda";
    yetanotherPerson.friends.push("Barbie");
    
    alert(anotherPerson.name);   //Greg
    alert(anotherPerson.friends);   //Shlby,huu,dima,rob,Barbie
    alert(yetanotherPerson.name);   //Linda
    alert(yetanotherPerson.friends);   //Shlby,huu,dima,rob,Barbie
    alert(person.name);     //Nico
    alert(person.friends);    //Shlby,huu,dima,rob,Barbie
このプロトタイプの継承は、他のオブジェクトの基礎とすることができるオブジェクトが必要です.このような対象があれば、それをobject()関数に伝えて、具体的な需要によって得られた対象を修正すればいいです.
この例では、もう一つのオブジェクトのベースとなるのがpersonオブジェクトであるため、Object関数に導入され、この関数は新しいオブジェクトに戻り、このオブジェクトはpersonをモデルとしているので、そのプロトタイプには基本タイプの値属性と参照タイプの値属性が含まれています.これはperson.friendsがpersonだけでなく、anothersonとyet Anothersonにも共有されることを意味します.実際には、これはまた、personオブジェクトの2つのコピーを作成するのに相当します.
ECMAScript 5は、Object.create()のプロトタイプ継承を規範化したものを追加しました.この方法は、新しいオブジェクトのプロトタイプとして使用するオブジェクトと、新しいオブジェクトのための追加属性を定義するオブジェクトとを受け取ります.一つのパラメータが入った場合、Object.create()は、Object()方法と同じ挙動をします.上記のように注釈されたコードです.
Object.creat()メソッドの2番目のパラメータはObject.defineProperties()メソッドの2番目のパラメータフォーマットと同じです.各属性は自分のディスクリプタによって定義されます.このように指定した属性はいずれも原型オブジェクト上の同名属性をカバーします.
たとえば:
var person ={
    name:"Nico",
    friends:["Shelby","Court","Van"]
}

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

alert(anotherPerson.name);    //Greg
Object.creat()メソッドをサポートするブラウザには、IE 9+,FF 4+,Safari 5+,Opera 12+,Chromeがあります.
大勢の人を動員して立体関数を作成する必要はなく、ただ一つのオブジェクトを他のオブジェクトと同じように維持したい場合、原型式で継承することができます.ただし、参照タイプの値を含む属性は常にインスタンスによって共有され、プロトタイプのパターンを使用するように記憶されている.