咱們都知道直接在原生對象上擴展對象是很很差的。因此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的官方討論組才知道這是不被支持的。優化
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並不能作的更好。
程序,必須是優美的。