2016-12-19 14 views
1

私はこれをarticle角度継承について読んでおり、JavaScript Prototypal Inheritanceから始めました。記事によると、childScope.aString = 'child string'という新しいプロパティは、同じ名前がのparentScopeプロパティを隠す/シャドウしますが、childScope.anArray[1] = 22を実行すると、元のオブジェクトのプロパティ値が更新されます。と私はそれを理解していません。
誰でも助けることができます。
は、明示的にオブジェクトaのプロパティbに値を代入し、事前にJavaScriptプロトタイプ継承

+0

私はより長い抽出が役立つと思います。私は彼らが何を話しているのか知っていることはほとんど確信していますが、あなたの引用は本当に誤解を招くものです。 – Sebas

+0

私は記事へのリンクを追加しました。私の問題は最初の段落を説明しています。 – aName

+0

私はそれがプリミティブであればオブジェクトのタイプに依存していると思いますが、それは子スクープで作成されます存在していない場合)、それ以外の場合は親スコープでそれを探します – aName

答えて

1
childScope.aString = 'child string' 
childScope.anArray[1] = 22 

1

ためのルックアップ操作を読みません

最初のケースでは、プロパティのに割り当てが直接行われています。 JavaScriptは子スコープに新しいプロパティを追加します。

2番目のケースでは、プロパティの内容に割り当てが行われています。プロパティは子スコープに存在しないため、JavaScriptはプロトタイプチェーンを検索して既存のの内容を検索してを修正します。

詳細については、AngularJS Wiki -- Understanding Scopes and the Nuances of Prototypical Inheritanceを参照してください。

3

a.b = cをお願いします。暗黙的に継承されたすべてのプロパティが上書きされます。実際の継承と実際のJavaScriptでサンプル:

function A() {} 
 
A.prototype.b = 'c'; 
 

 
var a = new A(); 
 
console.log(a.b);

aが実際にプロパティbを持っていない、それは単にプロトタイプから継承されています。今:

a.b = 'd'; 

これは今aに直接実際のプロパティbを添付しました。プロトタイプはまだプロパティーb = 'c'を持っていますが、これはもうaには表示されません。 a.b'd'になりました。

これとa.anArray[1] = 22の違いは、ここではです。変更可能なオブジェクトはです。 aのプロパティに割り当てていない場合は、aからプロパティを取得してから変更します。これは変更されませんa、それはオブジェクトanArrayのインスタンスを変更します。 anArrayにアクセスできるすべてに表示されます。

+0

応答してくれてありがとうございますが、私はまだ何かを理解していません。あなたは「あなたは不動産を取得してから変更します」と言ったが、 'anArray'というプロパティを持っています – aName

+0

@aName a.anArray = [10,22,30]を実行すると、その違いをローカライズするのに役立つはずです。 'a.b = ... 'は上書きしています。b。 'a.b [i] = ...'はbを上書きしていないので、bのインデックスiの値を上書きしています。 – Sebas

+0

だから、それがオブジェクトかプリミティブの場合には属性のタイプに依存します。 – aName

1

プロパティアクセスの解決は、プロパティの書き込みまたは読み取り操作の一部として発生する可能性があります。 Prototypal継承では、読み取り操作の一部としての解決だけが継承されたプロパティの参照を必要とすると述べています。

最初のシナリオでは、プロパティに書き込みオペレーションが含まれているため、継承されたプロパティのルックアップは発生しません。しかし、プロパティルックアップは、プロパティではない書き込み動作、プロパティのインデックス・ルックアップの一部として起こる第2のシナリオでは

- すなわちこれ継承されたプロパティ

関連する問題