2012-10-11 3 views
1

아래에 표시된 것처럼 모듈 패턴을 사용하여 자바 스크립트를 사용하고 있습니다. 그것은 나중에 호출하는 콜백 함수를 받아들입니다. 그 콜백 함수가 클래스에 정의 된 함수를 호출 할 수있게하려고하지만 작동하지 않습니다.Revealing Module Pattern 인스턴스를 콜백 함수에 전달할 수 있습니까?

window.MyClass = function() { 
    var self = this, 

    start = function (callback) { 
    callback(self); 
    }, 

    cancel = function() { 
    console.log('Cancel invoked'); 
    }; 

    return { 
    start: start, 
    cancel: cancel 
    }; 
}; 

var myCallbackFunction = function(instance) { 
    instance.cancel(); // Error: instance.cancel is not a function 
}; 

var obj = new window.MyClass(); 
obj.start(myCallbackFunction); 

나는 밝히려 프로토 타입 패턴에이 샘플을 재 작업 할 수 있으며 예상대로, 그래서 내 질문에 나는이 패턴의 단지 제한이 RMP를 사용하여 작업, 또는이다 얻을 수있다 작품?

감사합니다, 로저

답변

4
window.MyClass = function() { 
    var self = this; 

    this.start = function (callback) { 
    callback(self); 
    }; 

    this.cancel = function() { 
    console.log('Cancel invoked'); 
    }; 

    return { 
    start: this.start, 
    cancel: this.cancel 
    }; 
}; 

는 그런 다음, 반환 된 값을 통해 인스턴스 방법, 사용 가능한 양이다.

하지만 단순한 (예 : 개인 변수가없는) 무언가에 대해 필자는 곧은 프로토 타입 ("프로토 타입 패턴")을 사용합니다.

그런데 this series을 읽는다면, 이것이 표준 용어가 아님을 알아야합니다.

그는 또한 "JavaScript는 C#이나 Java처럼 클래스 또는 객체 지향 프로그래밍을 염두에두고 설계되지 않았지만 약간의 작업만으로 비슷한 결과를 얻을 수 있습니다." 실제로 JavaScript는 객체 지향 프로그래밍을 위해 설계되었지만 프로토 타입 기반입니다. 당신이 보았던 것처럼 대안을 허용 할만큼 충분히 유연합니다. 그 대안은 확실히 어떤 경우에는 더 낫다.

개체가 묶여 있기 때문에 자기조차 필요하지 않습니다.

그래서 :

window.MyClass = function(){}; 

window.MyClass.prototype = { 
    start: function (callback) { 
     callback(this); 
    }, 

    cancel: function() { 
     console.log('Cancel invoked'); 
    } 
}; 


var myCallbackFunction = function(instance) { 
    instance.cancel(); 
}; 

var obj = new window.MyClass(); 
obj.start(myCallbackFunction); 
+0

감사! 나는 그것이 가능하다는 것을 이해했다 - 나는 지금 막 구문을 파악하고 있지 않았다. – Roger

+0

첫 번째 예는 오해의 소지가 있습니다. 이유는 제 대답에 설명되어 있습니다. 당신은'MyClass'의 실제 인스턴스를 전혀 얻지 못하고 있습니다. 그러나이 예에서도 중요하지 않습니다. 그러나 이해해야 할 중요한 세부 사항입니다. –

1

생성자에서 객체를 반환하지 마십시오. 이것은 이상한 JS 단점 중 하나입니다.

MyClass의 인스턴스가 표시되지 않으면 일반 개체가 나타납니다. 생성자가 객체를 반환하면 해당 객체는 대신에 으로 반환됩니다.

// good! 
function MyClass() {}; 
new MyClass().constructor // returns: function MyClass() {} 
new MyClass().constructor == MyClass // true 

// bad! 
function MyClass() { return {a:123}; }; 
new MyClass().constructor // returns: function Object() { [native code] } 
new MyClass().constructor == MyClass // false 

요약하면 고전 스타일과 공개 모듈 스타일은 잘 어울리지 않습니다.

경우에 따라 this 속성에 할당 된 함수는 해당 함수를 외부에 공개하고있는 것입니다. 어쩌면 당신이 대신 이것을 원할 수도 있습니다.

window.MyClass = function() { 
    var self = this; 

    var start = function (callback) { 
    callback(self); 
    }; 

    var cancel = function() { 
    somePrivateFn(); 
    console.log('Cancel invoked'); 
    }; 

    var somePrivateFn = function() { 
    console.log('private function!'); 
    }; 

    this.start = start; 
    this.cancel = cancel; 
}; 

그러나 마태 복음은 신속하고 간단하게 모든 안부 인 제안처럼 사용합니다 (예를 들어 모든 것을 밝혀, 그래서 아무것도 개인 남아 있지) 프로토 타입 기반의 접근 방식을 개인 아무것도 필요하지 않은 경우.

관련 문제