使用标准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类添加方法。
答案 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>