失敗的嘗試,使用繼承擴展數組,以及ES6的必要性

咱們都知道直接在原生對象上擴展對象是很很差的。因此prototype這樣的庫廣受非議。es6

一些庫,好比lodash採用了工具包形式的擴展方式,繞開了對象的繼承。瀏覽器

因爲es6的class的出現,我嘗試以Array派生子對象的方式進行擴展。babel

如下是一個簡單的例子。數據結構

"use strict"
class Abc extends Array{
  getarray(){
    return this;
  }
}
let x=new Abc(5).fill(1);
console.log(x.getarray());

在v8中,這個例子是會輸出正確結果[1,1,1,1,1]的。異步

爾後爲了兼容其它瀏覽器,我嘗試使用babel.js轉碼爲es5。工具

可是這一步不管怎麼樣都沒有成功。性能

最後我進入babel的官方討論組才知道這是不被支持的。優化

loganfsmyth給出一個寫法this

class ExtendableArray {
    constructor(...args){
        const arr = new Array(...args);
        Object.setPrototypeOf(arr, this.constructor.prototype);
        return arr;
    }
}

可是很顯然,instanceof 以及Array.isArray 等語句都會有問題。es5

所以,現階段並不存在完美的替代方案。

 

不少人都說,es6中的不少東西是語法糖。

不錯,確實如此。

可是做爲腳本語言,越精煉的腳本,掃描速度就會更快,壓縮器的性能潛力也會提高。

冗長的語法歷來就沒有實質的意義,須要的,更可能是書寫形式的工整。

es6的諸多特性大多對這幾點都有幫助。

模塊的出現統一了目前繁雜的加載方式。

一系列異步語句的提出解決了回調地獄。

類的提出簡化了繼承過程。

更多的基礎數據結構優化了數據處理性能。

雖然若是不考慮效率,es6能作到的,es5大多也能作到。

可是es5並不能作的更好。

程序,必須是優美的。

相關文章
相關標籤/搜索