JAvascriptプロトタイプの読み取りと修正には特に注意が必要です.プロトタイプの読み書きには対等性がないからです.
1325 ワード
プロトタイプオブジェクトから継承されたメンバーの読み取りと書き込みには、内在的な不等性があります.例えば、そのプロトタイプオブジェクトが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メカニズムにより、オブジェクト間の相互影響が保証されることも理解できる.このメカニズムは良くも悪くも、使うときに注意が必要です.
上のコードから,プロトタイプの書き込みには確かにcopy-on-write特性があることがわかる.属性やメソッドがオブジェクト自体から来るのか、プロトタイプから来たのかを知りたい場合は、Objectを使用します.hasOwnProperty()関数.JSのほとんどの関数では,データがオブジェクト自身から来たのか,プロトタイプチェーンから来たのかは区別されず,この関数のみが区別される.
どうして書くときに原型を無視するのですか?プロトタイプはすべてのオブジェクトが共有されるため、このような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