在vue開發過程中,想要實現乙個自定義的類實現繼承原生陣列,這樣即可以用原生陣列的功能,還可以拓展自己的功能,並且不用改變原生陣列原型不會影響原來陣列的功能。
**如下
class
extendarray
extends
array
findandreplace
(fn, item)
findandmerge
(fn, item)
}const earr =
newextendarray(1
,2,3
)earr.
replace
(val =>,4
)console.
log(earr)
//extendarray(3) [1, 4, 3]
上面這個**跑谷歌瀏覽器中沒什麼毛病,不過在ie下可就沒那麼又好了。專案中引用有babel外掛程式正常情況會自動做降級處理的,不過好像不支援處理對原生js物件繼承,後來找到一種方法,配置.babelrc檔案
方法如下:
配置.babelrc檔案如下:
}]
,"stage-2"],
"plugins":[
"transform-vue-jsx"
,"transform-runtime",[
"transform-builtin-extend",]
]}
注意在globals:中新增 array, 這樣降級處理的時候就支援對原生陣列的繼承了。
使用es5 寫法,上面新增配置後可以解決問題,但是在某些情況還是會出錯,最好我只好自己實現乙個繼承原生陣列的類。**如下:
// 定義原型的方法
const methods =
,findandreplace
(fn, item)
,findandmerge
(fn, item)
}// 陣列繼承類,解決babel 不能處理es6直接繼承原生陣列的問題
function
extendarray
(...param))}
const prototype = object.
create
(array.prototype)
// 定義原型上的方法, 並且不能列舉
object.
keys
(methods)
.map
(key =>)}
)// 設定原型
extendarray.prototype = prototype
export
default extendarray
上面方法首先定義extendarray 構造方法,在構造內部
function
extendarray
(...param)
)}
注意: 在內部沒有呼叫 array.call(this, …param),是因為,我這麼嘗試之後,發現新建立的物件並沒有被賦予陣列例項的屬性,所以我只好用object.assign手動複製。注意陣列中length 是不可列舉的,這裡我也通過object.definpropery 設定其 enumerable 為false,否則會通過for in 迴圈遍歷出來。
然後用object.create(array.prototype) 建立乙個繼承陣列的原型物件。然後在將定義好的原型方法設定到原型物件上,通常原型上的方法是不應該被列舉的,這裡同樣設定為不可列舉。
Babel下的ES6相容性與規範
自 es6特性 相容性箭頭函式 支援類的宣告和繼承 部分支援,ie8不支援 增強的物件字面量 支援字串模板 支援解構 支援,但注意使用方式 引數預設值,不定引數,拓展引數 支援let與const 支援for of ie不支援 iterator,generator 不支援模組 module proxi...
js原生 ES6陣列去重
方法一 給陣列原型新增unique方法,那麼陣列就可以在任何地方像用push的方法一樣,直接使用。繫結unique去重方法到array原型上 array.prototype.unique function newarr for let item of this return newarr 使用陣列去...
ES6中Proxy的相容處理
proxy物件用於定義基本操作的自定義行為 如屬性查詢 賦值 列舉 函式呼叫等 proxy部分相容處理 author 範圍兄 window.proxy window.proxy function target,handler function proxy else else if handler.c...