web-dev-qa-db-ja.com

AngularJSにおけるスコープのプロトタイプ/プロトタイプ継承のニュースは何ですか?

API Reference Scopeページ と言う:

スコープcanは、親スコープから継承します。

開発者ガイドのスコープページ は言う:

スコープは(プロトタイプ的に)その親スコープからプロパティを継承します。

では、子スコープは常にその親スコープからプロトタイプ的に継承するのでしょうか。例外はありますか?継承する場合、それは常に通常のJavaScriptプロトタイプ継承ですか?

1006
Mark Rajcok

私は決してMarkの答えと競合するつもりはありませんが、 Javascriptの継承とそのプロトタイプチェーン に初めての人としてクリックされるようにした部分を強調したいだけでした。

プロパティの読み込みのみがプロトタイプチェーンを検索し、書き込みはしません。 だからあなたが設定したとき

myObject.prop = '123';

チェーンを調べませんが、設定したとき

myObject.myThing.prop = '123';

その書き込み操作の中で微妙な読み取りが行われています そのpropに書き込む前にmyThingを検索しようとします。だから子からobject.propertiesへの書き込みが親のオブジェクトにたどり着くのはそのためです。

139
Scott Driscoll

@Scott Driscollの回答に、JavaScriptを使ったプロトタイプ継承の例を追加します。 EcmaScript 5仕様の一部であるObject.create()で古典的な継承パターンを使用します。

最初に "Parent"オブジェクト関数を作成します

function Parent(){

}

次に、 "Parent"オブジェクト関数にプロトタイプを追加します

 Parent.prototype = {
 primitive : 1,
 object : {
    one : 1
   }
}

「子」オブジェクト関数を作成します

function Child(){

}

子プロトタイプを割り当てる(子プロトタイプを親プロトタイプから継承する)

Child.prototype = Object.create(Parent.prototype);

適切な「子」プロトタイプコンストラクタを割り当てる

Child.prototype.constructor = Child;

メソッド "changeProps"を子プロトタイプに追加すると、子オブジェクトの "primitive"プロパティ値が書き換えられ、子オブジェクトと親オブジェクトの両方の "object.one"値が変更されます。

Child.prototype.changeProps = function(){
    this.primitive = 2;
    this.object.one = 2;
};

親(お父さん)と子(息子)のオブジェクトを開始します。

var dad = new Parent();
var son = new Child();

子(息子)のchangePropsメソッドを呼び出す

son.changeProps();

結果を確認してください。

親プリミティブプロパティは変更されませんでした

console.log(dad.primitive); /* 1 */

子プリミティブプロパティが変更(書き換え)

console.log(son.primitive); /* 2 */

親と子のobject.oneプロパティが変更されました

console.log(dad.object.one); /* 2 */
console.log(son.object.one); /* 2 */

ここでの作業例 http://jsbin.com/xexurukiso/1/edit/

Object.createの詳細情報はこちら https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/create

20
tylik