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

标签 javascript constructor prototype

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

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/

相关文章:

javascript - 关于 return 关键字

JavaScript 和 __proto__ - 哪些浏览器使用它?

javascript - 在 Javascript 中为 Object 定义一个原型(prototype)函数可以吗?

javascript - 如何将 'cut' DOM元素显示在其他地方?

php - "Loading Record Number [##] of [Total]"进度条

C++:构造函数歧义

Java:重载相互调用的构造函数

javascript - __proto__ VS。 JavaScript 中的原型(prototype)

javascript - 将 api 响应推送到 .map() 中的全局变量以某种方式使数据无法访问

javascript - AngularJS 嵌套 ng-if 不工作