2015-11-17 99 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是當前的一個。