Prototype의 클래스 구현 (및 일부 Object.extend)에 의존하는 일련의 클래스가 생성되었습니다.Prototype.js 클래스 시스템 대체
문제는 프로토 타입이 다른 응용 프로그램과 통합 할 때 문제가되는 것입니다 ("noconflict"어댑터와 같은 경우에도 마찬가지입니다).
누구나 전역 범위를 망치지 않는 호환 가능한 클래스 구현을 알고 있습니까? 또는 누구나 Prototype을 사용하여 "추출"할 수 있습니까?
Prototype의 클래스 구현 (및 일부 Object.extend)에 의존하는 일련의 클래스가 생성되었습니다.Prototype.js 클래스 시스템 대체
문제는 프로토 타입이 다른 응용 프로그램과 통합 할 때 문제가되는 것입니다 ("noconflict"어댑터와 같은 경우에도 마찬가지입니다).
누구나 전역 범위를 망치지 않는 호환 가능한 클래스 구현을 알고 있습니까? 또는 누구나 Prototype을 사용하여 "추출"할 수 있습니까?
나에게 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};
});
프로토 타입 소스가 모듈화되어 있으므로 lang/class.js을 별도로 다운로드 할 수 있습니다. 그러나 코드를 한 눈에 보면 lang/array.js, lang/object.js, lang/function.js의 함수에 따라 달라집니다. prototype.js과 모든 lang 디렉토리를 잡는 것이 더 안전합니다. 그러면 DOM과 상충되는 Prototype의 핵심이 생깁니다.
나는 Class
클래스도 없이는 유용하다고 생각합니다.나는 이 인 Sugar을 시도해 볼 것을 추천 받았지만 여전히 상속을받지 못했습니다. 유일한 대안은 현재 MooTools' class입니다. 난 당신이 즐길 생각 MyJS class system
:
당신은 한 번 봐해야!
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);
},
...
}
상속의 여러 수준, 그렇지 않으면 당신은 무한 재귀를 얻을거야.