我想創建構造函數的構造函數。 有關此主題:JavaScript build a constructor of constructors,似乎唯一的解決方案是:JavaScript更好的修改函數原型的方法
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__
:
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.prototype
不是A.__proto__
但A.prototype
是(new A).__proto__
。
它通過修改__proto__
完美工作,真是太遺憾了。 我讀到Firefox已經集成了一個「Object.setPrototypeOf()」,但它只是實驗性的。
它是另一種做我想做的事情的方式嗎?
a.constructor.prototype == a .__ proto__,除非你打破link.does,這有助於你的跨瀏覽器實現嗎? – dandavis
它不是'a .__ proto',我正在修改,它是'A .__ proto__'這是一個函數,不是'ConstBuilder'的實例,因爲ConstBuilder直接返回它而不是返回它的新實例。 – Tot
對不起,我沒有注意到你在代碼中使用了「a」;我廣泛地講話。所以,X.constructor.prototype == X .__ proto__ – dandavis