/**
* 잘 설계된 주기 실행기
* 먼저 Class.create(),
*로 PeriodicalExecuter 유형을 만든 다음 객체 리터럴 구문을 사용하여 프로토타입을 설정합니다.
*
* 특별히 설명이 필요한 것은 rgisterCallback 메소드인데, 위에서 정의한 함수 프로토타입 메소드인 바인드를 호출하고 자신을 매개변수로 전달하는 메소드입니다.
* 이렇게 하는 이유는 setTimeout이 기본적으로 항상 창 객체를 현재 객체로 취하기 때문입니다. 즉, RegisterCallback 메소드가 다음과 같이 정의된 경우입니다.
* RegisterCallback: function() {
* setTimeout(this.onTimerEvent, this.주파수 * 1000);
* }
* 그러면 this.currentlyExecuting 속성에 액세스할 수 없어 this.onTimeoutEvent 메서드가 실행되지 않습니다.
* 바인드를 사용한 후 이 메소드는 PeriodicalExecuter의 현재 인스턴스인 이를 올바르게 찾을 수 있습니다.
*/
var PeriodicalExecuter = 클래스 .create();
PeriodicalExecuter.prototype = {
initialize: function(callback, 주파수) {
this.callback = callback;
this.주파수 = 주파수; .currentlyExecuting = false;
this.registerCallback();
},
registerCallback: function() {
setTimeout(this.onTimerEvent.bind(this), this. 빈도 * 1000 )
},
onTimerEvent: function() {
if (!this.currentlyExecuting) {
try {
this.currentlyExecuting = true; this.callback ();
} 마지막으로 {
this.currentlyExecuting = false;
}
}
this.registerCallback()
}
구체적으로 Class.create() 뒤에서 수행되는 작업, Class 구현을 살펴보겠습니다.
/**
* 유형을 생성합니다. 해당 속성인 create는 메소드이고 생성자를 반환합니다.
*는 일반적으로 다음과 같이 사용됩니다.
* var X = Class.create(); Java의 Class 인스턴스와 유사한 유형을 반환합니다.
* X 유형을 사용하려면 Java의 Class.newInstance() 메서드와 마찬가지로 계속해서 new X()를 사용하여 인스턴스를 얻어야 합니다.
*
* 반환된 생성자는 초기화라는 메서드를 실행합니다. 여기서 초기화는 Ruby 객체의 생성자 메서드 이름입니다.
* 현재 초기화 메소드는 정의되지 않았습니다. 후속 코드에서 새 유형을 생성할 때 동일한 이름의 해당 메소드가 설정됩니다.
*/
var Class = {
create: function() {
return function() {
this.initialize.apply(this, 인수)
}
}
}
Class.create는 실제로 함수를 반환하는데, new가 사용될 때 무엇을 합니까? MDN
new foo(...) 코드가 실행되면 다음과 같은 일이 발생합니다.
foo.prototype을 상속하는 새 객체가 생성됩니다.
foo 함수는 지정된 인수로 호출되며 새로 생성된 객체에 바인딩됩니다. new foo는 new foo()와 동일합니다. 즉, 인수 목록이 지정되지 않은 경우 foo는 인수 없이 호출됩니다.
생성자가 반환한 객체입니다. 함수는 전체 새로운 표현식의 결과가 됩니다. 생성자 함수가 명시적으로 개체를 반환하지 않으면 1단계에서 생성된 개체가 대신 사용됩니다. (일반적으로 생성자는 값을 반환하지 않지만 다음과 같은 경우 그렇게 하도록 선택할 수 있습니다. 그들은 일반적인 객체 생성 프로세스를 재정의하려고 합니다.)
new일 때 반환된 함수가 실행됩니다. 즉, 이때 this.initialize.apply(this, 인수)는 새로 생성된 객체입니다. 모든 객체의 초기화 작업이 초기화 함수에 위임된다는 의미입니다.
-------
여기서 초기화 메소드를 자신에게 바인딩해야 하는 이유는 무엇입니까? ?