【问题标题】:Assign multiple functions to class in ES6将多个函数分配给 ES6 中的类
【发布时间】:2015-11-22 12:17:36
【问题描述】:

我希望有一个主类,其中的方法派生自许多其他附加函数。所以说我有

class MasterObject {
   method1...,
   method2...,
   etc...
}

使用 ES6,id 喜欢导入这些函数以分配给 MasterClass 作为方法。所以我尝试了这样的事情:

function setUpObj (...fns) {

    class MasterObj {
         constructor (...args) {
              Object.assign(this, args)
         }
    }

    return new MasterObj(fns)
 }

 let master = setUpObj(square, add, divide)

 master.square(1,2) 

当我这样做时,这些方法实际上并没有分配给对象(我假设它们被分配给 this,但不是作为方法)。显然我不明白原型继承是如何工作的,所以如果你能用 ES6 类来解释它,那真的会对我有很大帮助。

相关: https://gist.github.com/allenwb/53927e46b31564168a1d ES6 Class Multiple inheritance

【问题讨论】:

    标签: javascript ecmascript-6


    【解决方案1】:

    Object.assign 接受包含要复制的属性的对象。在您的情况下,您将传递给它一个数组,这意味着您将拥有square 作为master[0](1, 2)。如果您希望它们命名,则需要将它们与名称一起传递,例如

    function setUpObj (fns) {
    
        class MasterObj {
             constructor (args) {
                 Object.assign(this, args);
             }
        }
    
        return new MasterObj(fns)
    }
    
    let master = setUpObj({square, add, divide})
    
    master.square(1, 2);
    

    也就是说,这个设置看起来有点奇怪,因为你每次都在重新声明这个类。也许这样的事情会更清楚:

    function setUpObj (fns) {
        class MasterObj {
        }
    
        Object.assign(MasterObj.prototype, fns);
    
        return MasterObj;
    }
    
    let MasterObjWithFunctions = setUpObj({square, add, divide})
    
    let master = new MasterObjWithFunctions();
    
    master.square(1, 2) 
    

    【讨论】:

    • 这是一个更清晰的答案
    • 感谢您的回答。我将上面的一个标记为答案,因为它是第一个答案......我明白你对第二个版本中的设置的意思。
    【解决方案2】:

    您需要让Object.assign 获取一个对象,以便它知道调用函数的内容。

    还需要直接修改prototype,使函数绑定到class而不是this

    function setUpObj (fns) {
    
        class MasterObj { }
    
        Object.assign( MasterObj.prototype, fns );
    
        return new MasterObj()
     }
    
     let master = setUpObj({ square, add, divide })
    
     master.square(1,2) 
    

    【讨论】:

      猜你喜欢
      • 2016-09-23
      • 2012-04-01
      • 2019-06-29
      • 1970-01-01
      • 1970-01-01
      • 2018-06-23
      • 2014-10-09
      相关资源
      最近更新 更多