gpt4 book ai didi

JavaScript 构建构造函数的构造函数

转载 作者:行者123 更新时间:2023-11-30 10:20:19 24 4
gpt4 key购买 nike

这是我想要的一个简单示例:

var ConstBuilder = function() {
var constructor = function() {} ;
constructor.prototype = {} ;
return constructor ;
} ;

ConstBuilder.prototype = {
add : function(name, value) {
this.prototype[name] = value ;
}
} ;

var A = new ConstBuilder() ;
A.add('test', function() {
console.log('test') ;
}) ;

var a = new A() ;
a.test() ;

此代码将失败,因为 A 不是 ConstBuilder 的实例(因为 A 来自返回的 var constructor = function () {} 并且不会在其原型(prototype) (add) 中定义方法。

但这对于修改 super 构造函数的原型(prototype)以使其具有如下内容很有用:

ConstBuilder.prototype.remove = function(name) {
delete this.prototype[name] ;
} ;

A.remove('test') ;

a.test ; // undefined

有没有办法让一个函数成为另一个函数的实例?所以这个函数可能会隐含地“继承”在它的构造函数的原型(prototype)中定义的所有方法。

或者,如果您有其他建议,我的目标是构建可调节的构造函数 - 就像带有原型(prototype)的实例一样。

最佳答案

请确保您已理解 .prototype 属性和内部继承原型(prototype)之间的区别。


The code will fail as A is not an instance of ConstBuilder. Is there a way to have a function as an instance of another?

A 是每个构造函数都需要的 Function .因此,如果您只是在 Function.prototype 上定义您的 addremove 方法,它将起作用:

Function.prototype.add = function(name, value) {
this.prototype[name] = value;
};
Function.prototype.remove = function(name) {
delete this.prototype[name];
};

function A() {}
A.add('test', function(){console.log('test');});
var a = new A();
a.test(); // test

A.remove('test');
a.test; // undefined

但是,除了 Function.prototype 之外,不可能让函数继承自其他东西 - 请参阅 Can a JavaScript object have a prototype chain, but also be a function? .如果你不想修改原生的 Function.prototype 对象,你仍然可以使用 mixin pattern :

var Constr = (function() {
function add(name, value) {
this.prototype[name] = value;
}
function remove(name) {
delete this.prototype[name];
}
return function mixin(c) {
c.add = add;
c.remove = remove;
return c;
};
})();

var A = Constr(function() {…});
A.add("test", …);
var a = new A();
a.test(); // test

I aim to build modulable constructors

您可以使用 builder pattern ,正如您刚刚尝试过的那样。

function ConstBuilder() {
this.prototype = {};
};

ConstBuilder.prototype = {
add: function(name, value) {
this.prototype[name] = value;
},
remove: function(name) {
delete this.prototype[name];
},
getConstructor: function() {
var constructor = function() {};
constructor.prototype = this.prototype;
this.prototype.constructor = constructor;
return constructor;
}
};

var A = new ConstBuilder().add('test', function() {
console.log('test');
}).getConstructor();
var a = new A();
a.test(); // test

要稍后删除函数,您需要保存对 builder 的引用。

关于JavaScript 构建构造函数的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21740787/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com