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

标签 javascript constructor subclassing

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

相关文章:

javascript - 缩放到 openlayers 中的搜索功能

javascript - 如何将 jquery .data 与动态添加的元素一起使用

C++,需要帮助理解使用指针的 vector 类中的一些构造函数和函数

swift - 创建 NSObject 的 swift 类子类会导致编译器错误

javascript - 在 `ceil(A[i]/2)`的K次运算后最小化数组总和

javascript - 模型更新后 AngularJS View 不更新

C++:构造函数歧义

c++ - 乱序初始化成员 - 这样可以吗?

swift - 子类化 Swift double /运算符重载类型别名

ios - 解析 : Using PFObject subclasses with PFCloud calls