2016-12-17 2 views
1

누군가 여기서 나에게 설명 할 수 있습니까?JS에서 확장 기능이있는 개체 확장

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

상황에 맞는 예를 들어 옵저버 패턴 https://addyosmani.com/resources/essentialjsdesignpatterns/book/#observerpatternjavascript

에서 사용 :

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

내가 무슨 생각
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); 
    } 
}; 

으로이 벌어지고 : 루프 간다통해 10 속성을 추가 한 다음 Observer 개체에 추가합니다. 이해가 안 무엇

:이 어떻게 와서는 만 나는 (addObserver이 removeObserver는 통보 즉 관찰자) 앞에 추가 속성이 아닌 확장 개체의 모든 속성을 추가?

나는 constructor 것을 볼 수 있습니다 내가 확장 개체를 인쇄 할 때 예를 들어 - 또는 __proto__ 속성 입니다 추가하지.

답변

1

기능이 extend 인 경우 objextension의 속성과 메서드를 상속받습니다.

따라서이 경우 controlCheckboxSubject의 속성과 메서드를 상속합니다.

당신은 Subject에서 모든 속성과 메소드를 얻을 것이다하지만 __proto__는 속성이나 방법이 아닙니다 -이 방법을 해결하기 위해 조회 체인에 사용되는 실제 객체 등 __proto__에 대해 설명 좋은 포스트 here이입니다

UPDATE 사실, 프로토는 속성입니다 -하지만 재산의 특별한 종류이다. From here :

지정된 개체의 내부 프로토 타입에 대한 참조를 포함합니다.

객체가 (프로토 타입 체인에서 상속 된 프로토 타입 제외) 단 하나의 프로토 타입을 가질 수 ...

그래서 체인에, 당신은 controlCheckbox에 대한 __proto__와의 속성 중 하나를해야합니다 그 __proto__ 이어야하며 __proto__Subjects이고 모든 속성과 메서드가 포함되어야합니다. 이 열거되지 않기 때문에

UPDATE 2 for (propName in obj) 루프를 사용하여 프로토 속성은 추가되지 않습니다. 열거 가능한 상속 된 속성 만 반환됩니다. 더 많은 정보를 얻으려면 EnumerablepropertyIsEnumerable()을 검색 할 수 있습니다.

관련 문제