我正在尝试创建一个工厂函数,它接受一个父类(super class)和一个函数作为参数,并返回一个子类的构造函数,该构造函数重写并将过滤器应用于 add() 方法。
我遇到的问题是,当我使用此构造函数创建此子类对象并调用 add() 时,无法识别 add() 方法。
如果有帮助,我正在尝试使用类似于 Javascript - The definitive guide by David Flanagan 的第 9.7.2 节的技术。
感谢任何帮助,谢谢。
function subclassFactory(superclass,func){
var constructor = function(){
superclass.apply(this,arguments);
var proto = constructor.prototype
= Object.create(superclass.prototype);
proto.constructor = constructor;
proto.add = function(){
if(!func(arguments))
{
return superclass.prototype.add.apply(this,arguments);
}
}
}
return constructor;
}
最佳答案
不要在构造函数中修改原型(prototype)。
请(根据经验)永远不要将参数对象传递给任何函数。 您希望避免将参数对象传递给另一个函数。 您希望避免将参数对象传递给另一个函数。 em>
它阻止了通过底层 JS 引擎进行的优化。请改用扩展运算符 (ES6 Rest parameters @ MDN) 或手动将参数复制到数组中。
function subclassFactory(superclass, func){
var constructor = function(/*...args*/){
//for(var i=arguments.length,args=Array(i);i--;)args[i]=arguments[i];
//return superclass.apply(this, args);
return superclass.apply(this, arguments);
}
constructor.prototype = Object.create(superclass.prototype, {
constructor: {
configurable: true,
value: constructor
},
add: {
value: function(/*...args*/){
for(var i=arguments.length,args=Array(i);i--;)args[i]=arguments[i];
if(!func(args)) return superclass.prototype.add.apply(this, args);
}
}
});
return constructor;
}
或者利用 ES6 类 ( Classes#Mix-ins @ MDN )
var subclassFactory = (superclass, func) => class extends superclass {
add(...args){
if(!func(args)) return super.add.apply(this, args);
}
}
关于javascript - 子类工厂缺少原型(prototype) - Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37931548/