JAvascriptプロトタイプの読み取りと修正には特に注意が必要です.プロトタイプの読み書きには対等性がないからです.


プロトタイプオブジェクトから継承されたメンバーの読み取りと書き込みには、内在的な不等性があります.例えば、そのプロトタイプオブジェクトがBであり、Bのプロトタイプオブジェクトがnullであると仮定するオブジェクトAがある.Aオブジェクトのname属性値を読み込む必要がある場合、JSはAで優先的に検索し、name属性が見つかったら戻ります.Aにname属性がない場合は、プロトタイプBにnameを検索し、見つかったら返します.プロトタイプBにも見つからない場合は、この時点でプロトタイプチェーンの最上位に達しているため、nameが見つからないため、undefinedに戻ります.書き込みの場合、A.name="aty"を実行し、Aにname属性がある場合、name属性の値が変更されます.Aにname属性がない場合、Aにname属性が追加され、プロトタイプを検索するプロセスはありません.
 
どうして書くときに原型を無視するのですか?プロトタイプはすべてのオブジェクトが共有されるため、このようなcopy-on-writeメカニズムにより、オブジェクト間の相互影響が保証されることも理解できる.このメカニズムは良くも悪くも、使うときに注意が必要です.
function Person() 
{  
}

// Person        
Person.prototype.plainProp="hi";
Person.prototype.objectProp={"age":10};

var a = new Person();
var b = new Person();


a.plainProp="hello";//    ,      

//         ,             
a.objectProp.age=20;

alert(a.plainProp);//hello
alert(b.plainProp);//hi
alert(a.objectProp.age);//20
alert(b.objectProp.age);//20

 
上のコードから,プロトタイプの書き込みには確かにcopy-on-write特性があることがわかる.属性やメソッドがオブジェクト自体から来るのか、プロトタイプから来たのかを知りたい場合は、Objectを使用します.hasOwnProperty()関数.JSのほとんどの関数では,データがオブジェクト自身から来たのか,プロトタイプチェーンから来たのかは区別されず,この関数のみが区別される.
//          ,      
alert(a.hasOwnProperty("plainProp"))//true
alert(a.hasOwnProperty("objectProp"));//false