子类工厂缺少原型-JavaScript



我正在尝试创建一个接受超级类和函数作为参数的工厂功能,并返回一个子类构造函数,该子类覆盖并将过滤器应用于add()方法。

我遇到的问题是当我使用此构造函数创建此子类对象并调用add()时,add()方法未识别。

如果它有助于我尝试使用类似于JavaScript的第9.7.2节的技术 - David Flanagan的"权威指南"。

感谢任何帮助,谢谢。

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;
  }

不要修改构造函数内部的原型。

,请(根据经验法则)永远不会将参数 - 对象传递给任何功能。 您需要避免将参数 - 对象传递到另一个功能。它可以通过基础JS-引擎来防止优化。改用播种操作器(ES6 REST参数 @ 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类(类#mix-ins @ mdn)

var subclassFactory = (superclass, func) => class extends superclass {
    add(...args){  
        if(!func(args)) return super.add.apply(this, args);
    }
}

如果您第一次致电subclassPrototype并且superclass变量在其原型链中没有add方法,则可能发生这种情况:

var parent = subclassFactory(function () {}, function(args) { ... }),
    child = subclassFactory(parent, function(args) { ... }),
    childInstance = new child();
child.add(...); // throws an exception

解决方案:

  1. 首先检查添加方法

  2. 始终传递到定义add的超级级对象中,其原型链中的某个地方

  3. 检查superClass原型中是否有一个添加方法,并在不存在的情况下丢弃错误

  4. 如果超级类不存在" add"方法,请默认为空函数

最新更新