以编程方式扩展es6类

时间:2015-11-17 10:08:23

标签: javascript ecmascript-6

使用标准es5我有这个方法,允许我添加方法到我的库的原型链(它允许扩展核心库以及附加到库的任何组件):

 library.extend = function(extendId, extendObj) {
        //if it's an extension of the core library object...
        if(extendId === 'library') {
            library.prototype[extendObj.name] = extendObj.func;
        } else {
            library.component[extendId].prototype[extendObj.name] = extendObj;
        }
 }; 

用法是:

 /* create some new class */
 var somecomponent = function() {}
 somecomponent.protoype.somemethod = function() {}

/* extend the base libraries prototype chain with the new class*/
library.extend('library', somecomponent)

在es6类中,我们也有原型,但它们被类语法掩盖,你应该使用extends方法向类中添加方法。

因此,我不确定如何使用类似于上面的方法以编程方式向es6类添加方法。

2 个答案:

答案 0 :(得分:2)

  

在es6类中,我们也有原型,但它们被类语法掩盖,你应该使用extends关键字向类中添加方法。

我不确定你的意思是“蒙面”。是的,这是不同的语法,但结果完全相同 - class创建一个具有.prototype属性的构造函数。因此,虽然extends语法当然更好,但您无法以编程方式使用它。请注意,extends用于子类化,而不是用于现有类的扩展,因此无论如何它都不适合您的需要。

  

我不确定如何使用类似于上面的方法以编程方式向ES6类添加方法。

继续使用您已有的方法。以这种方式做mixins是完全没问题的。

答案 1 :(得分:2)

我认为你有些困惑。

在ES5中,使用function表达式或声明创建的函数都是可实例化的(即构造函数)和可调用的:

function f() {}
f();     // Function call
new f(); // Constructor instantiation

然后ES6允许创建只可调用或仅可实例化的对象:

var f = () => {}; // Arrow function
f();              // Function call
new f();          // Error: f is not a constructor

class f {};       // Class
f();              // Error: Cannot call a class as a function
new f();          // Constructor instantiation

也就是说,ES6类只是具有[[Construct]]内部方法和prototype属性的对象。您可以将它们完全视为ES5构造函数。

所以用法是

class somecomponent { /* create some new class */
  somemethod() {}
}

/* extend the base libraries prototype chain with the new class*/
library.extend('library', somecomponent)

其中library.extend是当前的。{/ p>