gpt4 book ai didi

javascript - 子类工厂缺少原型(prototype) - Javascript

转载 作者:行者123 更新时间:2023-11-30 11:56:03 26 4
gpt4 key购买 nike

我正在尝试创建一个工厂函数,它接受一个父类(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/

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