생성자 생성자를 만들고 싶습니다. 이 스레드에 관한 : JavaScript build a constructor of constructors 것 같습니다 유일한 해결 방법은 다음과 같습니다더 좋은 방법은 함수 프로토 타입을 수정하는 것입니다.
Function.prototype.add = function(name, value) {
this.prototype[name] = value;
};
Function.prototype.remove = function(name) {
delete this.prototype[name];
};
하지만 일반 Function
프로토 타입을 수정하려면 ...도하지 않습니다
var A = new ConstBuilder().add('test', function() {
console.log('test');
}).getConstructor();
하지만 돈 생성자 주위에 객체 래퍼가 있어야합니다.
일반적으로 생성자는 생성자 프로토 타입에서 메서드를 상속하는 새 개체를 만듭니다. 난 할 노력하고있어하는 대신 객체의 instanciates 기능을하지만, 함수 프로토 타입 속성을 수정하는 유일한 방법이이 __proto__
속성을 수정하는 것입니다 :A.prototype
즉
var constructorPrototype = {
add : function(name, value) {
this.prototype[name] = value ;
}
} ;
var ConstBuilder = function() {
var constructor = function() {} ;
constructor.prototype = {} ;
// The only way (?), but quite deprecated...
constructor.__proto__ = constructorPrototype ;
return constructor ;
} ;
// Not working way...
//ConstBuilder.prototype = constructorPrototype ;
var A = new ConstBuilder() ;
A.add('test', function() {
console.log('test') ;
}) ;
var a = new A() ;
a.test() ; // "test"
constructorPrototype.remove : function() {
delete this.prototype[name] ;
} ;
A.remove('test') ;
a.test() ; // Error: test is not a function.
참고하지 A.__proto__
하지만,A.prototype
은 (new A).__proto__
입니다.
__proto__
을 수정하면 완벽하게 작동합니다. Firefox에 "Object.setPrototypeOf()"가 통합되어 있지만 읽기 전용입니다.
제가하고 싶은 일을하는 또 다른 방법이 있습니까?
a.constructor.prototype == a .__ proto__, 브라우저 간 구현에 도움이되는 link.does를 중단하지 않는 한? – dandavis
수정하고있는'a .__ proto'가 아니며'ConstBuilder'가 새로운 인스턴스를 반환하는 대신 직접 반환하기 때문에'A.__ proto__'는 함수이고'ConstBuilder'의 인스턴스가 아닙니다. – Tot
죄송합니다. 귀하의 코드에서 "a"를 사용했는지 알지 못했습니다. 나는 광범위하게 말하고 있었다. 그래서, X.constructor.prototype == X.__ proto__ – dandavis