2011-09-29 5 views
2

Prototype의 클래스 구현 (및 일부 Object.extend)에 의존하는 일련의 클래스가 생성되었습니다.Prototype.js 클래스 시스템 대체

문제는 프로토 타입이 다른 응용 프로그램과 통합 할 때 문제가되는 것입니다 ("noconflict"어댑터와 같은 경우에도 마찬가지입니다).

누구나 전역 범위를 망치지 않는 호환 가능한 클래스 구현을 알고 있습니까? 또는 누구나 Prototype을 사용하여 "추출"할 수 있습니까?

답변

4

나에게 wrote one 다시 몇 년을 (내가 그것을 다시 방문 가야하고, 그것을 적절한 이름을 부여) 나는 모든 함수를 만드는 작업이 포함됩니다은 "슈퍼 클래스", 메소드를 호출하는 프로토 타입의 처리를 좋아하지 않았기 때문에 재정의 된 메소드가 호출 된 시간 (예, 실제로). 슈퍼 콜을 만드는 방법을 제외하고는 프로토 타입과 매우 비슷합니다. 쉽게 코드를 입력하고 코드에서 super을 검색하여 변경할 수 있습니다. 구현에 따라 named functions rather than anonymous ones을 사용하는 것이 조금 더 쉬워졌습니다. 여러 가지 이유로 유용합니다. 도구가 도움이되기 때문입니다. 또한 사적인 "클래스"방법을 사소한 것으로 만듭니다. 아래 세부 사항.

하지만 광산을 사용할 필요는 없습니다. 거기에 코드를 마이그레이션하는 약간 더 많은 작업이 필요합니다 다른 옵션이 있지만, 아마 더 많은 : 모두와

내 문제 그것들은 함수 디 컴파일을 사용하므로 (Prototype의 Class), 함수 디 컴파일 (예 : 함수에 toString 호출)이 표준화 된 적이 없으며 일부 모바일 브라우저에서는 작동하지 않습니다. Resig의 메커니즘은 함수 디 컴파일이 작동하지 않는 경우에도 계속 작동하지만, 수퍼 콜을 만드는 메소드가 아닌 모든 메소드에 오버 헤드를 추가합니다. 내 메커니즘은 함수 디 컴파일을 전혀 사용하지 않고 메서드 호출에 이없고 오버 헤드를 추가하고 수퍼 콜을 매우 효율적으로 만듭니다.

내 메커니즘을 사용하여 프로토 타입의 코드는 다음과 같습니다 경우

var SuperThingy = Class.create({ 
    foo: function(arg) { 
     console.log("SuperThingy: " + arg); 
     this._pseudoPrivate(); 
    }, 
    _pseudoPrivate: function() { 
     console.log("I'm not really private."); 
    } 
}); 
var Thingy = Class.create(SuperThingy, { 
    foo: function(super, arg) { 
     console.log("Thingy: " + arg); 
     super(arg); 
    } 
}); 

당신은 할 수 있습니다 최소한의 변경 :

var SuperThingy = Helper.makeClass({ 
    foo: function(arg) { 
     console.log("SuperThingy: " + arg); 
     this._pseudoPrivate(); 
    }, 
    _pseudoPrivate: function() { 
     console.log("I'm not really private."); 
    } 
}); 
var Thingy = Helper.makeClass(SuperThingy, { 
    foo: function(arg) { 
     console.log("Thingy: " + arg); 
     this.callSuper(arguments, arg); 
    } 
}); 

을 ...하거나 약간 큰 변경하고 얻을 수있는 속도 향상 (callSuper이 느림arguments.callee), 제대로 명명 된 기능 (디버깅 용) 및 진정한 개인 기능 :

var SuperThingy = Helper.makeClass(function() { 
    function SuperThingy_foo(arg) { 
     console.log("SuperThingy: " + arg); 
     trulyPrivate.call(this); 
    } 

    function trulyPrivate() { 
     console.log("I'm truly private."); 
    } 

    return {foo: SuperThingy_foo}; 
}); 
var Thingy = Helper.makeClass(SuperThingy, function() { 
    function Thingy_foo(arg) { 
     console.log("Thingy: " + arg); 
     foo.$super.call(this, arg); 
    } 

    return {foo: Thingy_foo}; 
}); 
0

프로토 타입 소스가 모듈화되어 있으므로 lang/class.js을 별도로 다운로드 할 수 있습니다. 그러나 코드를 한 눈에 보면 lang/array.js, lang/object.js, lang/function.js의 함수에 따라 달라집니다. prototype.js과 모든 lang 디렉토리를 잡는 것이 더 안전합니다. 그러면 DOM과 상충되는 Prototype의 핵심이 생깁니다.

나는 Class 클래스도 없이는 유용하다고 생각합니다.나는 Sugar을 시도해 볼 것을 추천 받았지만 여전히 상속을받지 못했습니다. 유일한 대안은 현재 MooTools' class입니다. 난 당신이 즐길 생각 MyJS class system

:

0

ComposeJS을 시도한 후에 수퍼 클래스 생성자를 명시 적으로 호출하는 방법을 찾을 수 없어 (자동으로 호출 됨)이를 포기해야했습니다. 드디어 수퍼 클래스 생성자를 호출하는 약간 이상한 구문이긴하지만, 많은 기능 (상속, mixins, 정적 속성, AOP)을 가지고있는 JsFace에 마침내 정착했다 : this. $ class. $ super.call (args). 그것도 웹 사이트 및이 benchmark에 따르면, 가장 느린 실행 Resig 구현을 완전히 날려 버리는 것에 따라 가장 빠른 구현 인 것처럼 보인다. ..입니다 조심하는주의해야 할 점은 $ 슈퍼 항상 마지막 자식 클래스의 슈퍼 클래스입니다이 $ 클래스, 그래서 당신은 같은 것을 할 필요가 있습니다

var C = Class(A, { 
 
    constructor: function (x) { 
 
    C.$super.call(this, x); 
 
    }, 
 
    ... 
 
}

을 대신 당신이있는 경우의 예처럼

var C = Class(A, { 
 
    constructor: function (x) { 
 
    this.$class.$super.call(this, x); 
 
    }, 
 
    ... 
 
}

상속의 여러 수준, 그렇지 않으면 당신은 무한 재귀를 얻을거야.

관련 문제