2016-12-17 19 views
1

ここで何が起こっているのか説明できる人はいますか?拡張子がJSのオブジェクトを拡張する

function extend(obj, extension){ 
    for (var key in extension){ 
    obj[key] = extension[key]; 
    } 
} 

コンテキスト:たとえば、Observerパターンhttps://addyosmani.com/resources/essentialjsdesignpatterns/book/#observerpatternjavascript

で使用:

function Subject(){ 
    this.observers = new ObserverList(); 
} 

Subject.prototype.addObserver = function(observer){ 
    this.observers.add(observer); 
}; 

Subject.prototype.removeObserver = function(observer){ 
    this.observers.removeAt(this.observers.indexOf(observer, 0)); 
}; 

Subject.prototype.notify = function(context){ 
    var observerCount = this.observers.count(); 
    for(var i=0; i < observerCount; i++){ 
    this.observers.get(i).update(context); 
    } 
}; 

// Extend the controlling checkbox with the Subject class 
extend(controlCheckbox, new Subject()); 

で何が起こっているのか、私は思う:forループザ・が行きますを介して私が以前に追加した10のプロパティを追加し、それをObserverオブジェクトに追加します。私は理解していない何

はどのようにそれを来るだけで、これらの私は(addObserverは、removeObserverは、通知すなわちオブザーバー、)の前に追加されたプロパティではなく拡張オブジェクトのすべてのプロパティを追加しますか?私は拡張オブジェクトを印刷するとき、私は例えば

を見ることができるconstructorこと - または__proto__プロパティがあるませが追加されました。

答えて

1

extendは、objにプロパティとメソッドを継承しています。extensionです。

この場合、controlCheckboxは、Subjectのプロパティとメソッドを継承しています。

あなたはSubjectからすべてのプロパティとメソッドを取得しますが、__proto__は、プロパティやメソッドではありません - それは、メソッドを解決するために参照チェーンで使用されている実際のオブジェクトである、など__proto__を論じて良いポストhereがあります

UPDATE 実際、プロトは財産である - それは、プロパティの特別な種類です。 From here

指定されたオブジェクトの内部プロトタイプへの参照を含みます。

オブジェクトは(プロトタイプチェーンで継承された試作品は含まない)だけで、単一のプロトタイプを持つことができます...

のでチェーンで、あなたはcontrolCheckboxとその特性のいずれかの__proto__を持っています__proto__は、__proto__Subjectsであり、すべての特性および方法を含むべきである。それが列挙ないので

UPDATE 2 for (propName in obj)ループを使用して、プロトプロパティが追加されません。列挙可能なプロパティのみが返されます。詳細については、EnumerablepropertyIsEnumerable()を検索してください。