2015-11-17 56 views
4

使用标准ES5我有这样的方法,让我来添加方法到我的图书馆的原型链(它允许核心库的扩展,还附加到库中的所有组件):扩展ES6类编程

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

没有显示你如何使用这段代码,很难理解你在问什么。但是...通常ES2015类可以被认为是“正常”(ES5)功能。 – Amit

+1

你应该能够扩展原型。类更不仅仅是语法糖。 – webduvet

+0

@Amit我已经添加了一个用法示例,虽然我认为代码真的是自己说话......它只是扩展了一个原型链。 –

回答

2

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

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

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

只需继续使用您已有的方法。这种风格的mixin完全没问题。

2

我认为你有一些困惑。与function表达或声明创建

在ES5,函数都是可实例化的(即构造函数)和可调用:

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是当前的一个。