2010-07-22 4 views
5

자바 스크립트에서 디자인 패턴을 실험 해본 결과, 인스턴스 함수에 의해 재정의 될 수있는 싱글 톤 함수가있는 것처럼 보입니다. (다소 애매한) 자바 스크립트 상속 질문

Date.tomorrow = function() { 
    return Date.today().add(1).days(); 
} 

(function(p) { 

    p.tomorrow = function() { 
    var date = this.clone().clearTime(); 
    return date.equals(Date.tomorrow()); 
    } 

})(Date.prototype); 

그래서 두 tomorrow() 기능이 있습니다 :

다음은 간단한 예입니다. 직접 날짜 함수를 호출 할 때 :

>>> Date.tomorrow() 
=> Fri Jul 23 2010 00:00:00 GMT-0500 (CST) { _orient=1, more...} 

그러나 먼저 날짜 인스턴스를 인스턴스화 할 때

>>> var date = new Date() 
>>> date.tomorrow() 
=> false 
당신이 말할 수있는 확신으로 나는 많은을 떠날거야

, 그러나 희망을 요점을 얻으십시오. 내 질문은 이것입니다 : 최초의 tomorrow() 함수와 Date 객체의 관계는 무엇입니까? 정확히 무엇에 붙어 있니?

생성자가 아닌 일반 함수로이 작업을 수행했다고 가정 해 보겠습니다. 원래 기능에서 증강 기능을 호출 할 수 있습니까? 이 작업을 수행 할 수있는 생성자 함수에서

:
this.constructor.functionName(); 

하지만 함수가 생성자로 사용하지 않을 경우, 분명 constructor 참조가 존재하지 않을

. 해당 증강 된 기능에 액세스 할 수있는 또 다른 방법이 있습니까?

이 질문의 원동력은 프로젝트의 JS 코드를 재구성 한 작업에서 비롯된 것입니다. 우리는 Sprockets 시스템을 구현하여 소스 코드를 모듈로 분할합니다.이 모듈은 읽을 수없는 인라인 객체 정의에 모두 함께 포장하는 대신 기본적으로 기본 네임 스페이스를 꾸미고 있습니다.

우리는 아주 커다란 이벤트 와이어를 가지고 있습니다. 이것은 별개의 기능으로 나눌 수있어서 좋지만, 각 기능을 개별적으로 호출 할 필요는 없습니다. 대신 하나의 하위 함수를 모두 호출하는 수퍼 함수가 필요합니다.

언제든지 all() 함수를 만들 수 있지만 최상위 함수를 호출하면 연결된 모든 하위 함수가 실행될 때 API 관점에서 훨씬 더 깨끗해 보입니다.


프란시스코의 응답 덕분에 이제는 내가 생각한 것을 구현했습니다. 다음은 호기심이있는 경우를위한 예입니다.

var Namespace = {}; 

var Namespace.wireup = (function() { 

    return function() { 
    var self = arguments.callee; 
    self.eventWireup1(); 
    self.eventWireup2(); 
    }; 

})(); 

(function (W) { 

    function eventWireup1() { console.log('first function'); }; 
    function eventWireup2() { console.log('second function'); }; 

    $.extend(W, { 
    eventWireup1: eventWireup1, 
    eventWireup2: eventWireup2 
    }); 

})(Namespace.wireup); 

이 API의 장점은이 작업을 수행 할 수 있다는 것입니다 :

>>> Namespace.wireup.eventWireup1(); 
=> first function 
>>> Namespace.wireup.eventWireup2(); 
=> second function 
>>> Namespace.wireup(); 
=> first function 
=> second function 
+1

호기심에서 벗어남. 야후! 이벤트 라이브러리? 나는 당신이 묻고있는 것이 구체적이지는 않다는 것을 알고 있습니다 ... 그러나 괜찮은 대안이 있다면 당신이 필요로하지 않을 수도있는 것 같아 보입니까? (http://developer.yahoo.com/yui/event/) – Steve

+0

@Steve 내 질문은 실제로 이벤트 바인딩 그 자체가 아니라 모듈화의 한 형태와 관련이 있습니다. 암시 적 및 명시 적으로 모두 호출 할 수있는 특정 유형의 이벤트 와이어 업이 있습니다. 게다가 저는 이미 YUI보다 개인적으로 더 좋아하는 이벤트에 jQuery를 사용하고 있습니다. –

답변

0

내가이 질문을 업데이트해야한다고 생각 이상 사용되지 않습니다 내가 결국 더 엄격하고 엄격한 모드와 호환되는 것으로 바뀌 었습니다.

var Namespace = {}; 

(function() { 
    Namespace.wireup = function self() { 
    self.eventWireup1(); 
    self.eventWireup2(); 
    } 
})(); 

(function (self) { 
    self.eventWireup1 = function() { console.log('first function') } 
    self.eventWireup2 = function() { console.log('second function') } 
})(Namespace.wireup); 
2

날짜는 윈도우 객체의 함수(), 당신은 함수에 다른 기능을 장착하고 있습니다. 이상한가?

이 시도 :

function a() 
{ 
    return 10; 
} 

a.e = "oO"; 

typeof(a); 
typeof(a.e); 

이처럼 당신이 인수에서 호출자 속성을 사용하여 내부에서 전자에 액세스하려면 : arguments.callee 이후

function a() { 
    return arguments.callee.e; 
} 

a.e = "Oo" 

a(); 
+0

예, 이상합니다. 하지만 일반적으로 자바 상속은 이상한;) 내 질문은 - a.e.() 함수 자체 내에서 액세스 할 수 있습니까? 완전한 이름을 사용하지 않고 어떻게 그렇게 할 수 있습니까? –

+0

'arguments.callee'는 제가 찾고 있던 것입니다! 감사. –