2016-05-29 55 views
0

有沒有一種方法可以使用Browserify和Babelify與ES2015進行動態繼承?JavaScript ES2015具有browserify和babelify的動態繼承

我需要用額外的功能「構造函數」來包裝一個類「Predecessor」,我不知道前代將會是什麼,所以我不知道參數的數量或其執行的任何內容。

通常情況下,對於JS動態繼承,我會做:

function Constructor() { 
    Predecessor.apply(this, arguments); // <<-- this is what I'm trying to do. 
} 
Constructor.prototype = Object.create(Predecessor.prototype); 
Constructor.prototype.constructor = Constructor; 

當我嘗試使用ES2015:

class Constructor extends Predecessor { 
    constructor() { 
    super(arguments); 
    } 
} 

super(arguments)被轉化爲:

var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(Singleton).call(this, args)); 

所以,Predecessor得到執行類似如果你這樣做:new Predecessor([arguments]);(arr在陣列中)。

  1. 我試圖消除超並直接使用Predecessor.apply(this, arguments);但它拋出一個錯誤(super必須調用)。另外,我不想兩次執行Predecessor。
  2. 我試過super.apply(arguments)出於沮喪,當然,它不起作用(拋出一個包錯誤)。
  3. 我甚至嘗試eval(知道它的所有副作用),但沒有成功,甚至喜歡它的方式太複雜的解決方案。

我不想強迫開發人員說,所有的參數將在陣列中封閉,所以:

  • 我最後的資源已經承擔了的文件的最大數目:
  • 可怕的目光,絕對不是最好的做法:

    class Constructor extends Predecessor { 
        constructor(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z) { 
        super(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z); 
        } 
    } 
    

    我當然不喜歡它。

    那麼,它只是Babelify/Babel還是ES2015中不允許的?有什麼我可以做的,以改善這(有助於Babelify)?或者我應該回去舊的實施?

    如果你想知道我的編譯過程:

    { 
        // ... 
        "scripts": { 
        "dist": "./node_modules/browserify/bin/cmd.js ./src/index.js -o ./dist/bundle.js -t [ babelify --presets [ es2015 ] ]", 
        // ... 
        }, 
        "devDependencies": { 
        "babel-preset-es2015": "^6.9.0", 
        "babelify": "^7.3.0", 
        "browserify": "^13.0.1", 
        // ... 
        } 
    } 
    
    +2

    「*刪除超級拋出錯誤(」超級必須被調用「)*」 -​​ 這是一個[已知的Babel bug](https://phabricator.babeljs.io/T7248),它應該工作。 – Bergi

    回答

    3

    所以Predecessor被執行的東西一樣,如果你這樣做:new Predecessor([arguments]):陣列

    井內陣列,這是你寫的什麼:super(arguments)將整個對象傳遞給一個參數。你需要寫super(...arguments)來傳遞參數。甚至更好,不要使用任何arguments object更ES6但休息參數:

    class Constructor extends Predecessor { 
        constructor(...args) { 
        super(...args); 
        } 
    } 
    

    (或只是省略constructor方法,如果你沒有做任何事情,因爲這是默認行爲)。

    +0

    我不知道這是可能的 – camou