ES6私有變數與babel的愛情碰撞

2021-09-24 07:23:04 字數 2107 閱讀 1107

js原生不支援私有變數,這讓前端開發很頭痛,如何實現私有變數對於程式的健壯十分重要。下面就講下私有變數的幾種實現,以及對應的babel外掛程式。

主要是講es6相關的symbolweakmap,當然閉包也是可以實現的,本篇主要講es6的。

symbol

原生實現

let _method = symbol('_method');

class

foo

[_method]()

}複製**

babel外掛程式實現

babel-plugin-private-underscores

外掛程式自動處理下劃線開頭的屬性與方法,換成symbol型別的變數

class

foo

_method()

}複製**

weakmap

原生實現

const _private = new

weakmap();

class

foo getprivate()

}let foo = new foo();

console.log(foo.getprivate()); // private

複製**

babel官方外掛程式實現

我們使用babel官方的外掛程式@babel/plugin-proposal-private-methods, 鏈結。

babel官方外掛程式是js新的私有屬性/方法的提案,在私有屬性、方法前面加上#來標識。下面是對應的寫法

class foo 

#privatemethod()

}複製**

babel-plugin-transform-private-properties

babel-plugin-transform-private-properties外掛程式的寫法如下:

class

private_property_class_with_weakmap

@private

private_func ()

} let ppw = new private_property_class_with_weakmap()

console.log(ppw.getp()) // => foo

console.log(ppw.p) // => undefined

ppw.private_func() // error: ppw.private_func is not a function

複製**

babel產物可見babel try it out,需要自己手動加下pluginbabel-plugin-transform-private-properties,在右下角plugins處新增即可

final

最後對比下symbolweakmap的使用,其實兩者都實現了私有,並不想_只是乙個標記而已(感覺就像babel裡的設定為trueloose選項一樣)。 對比二者的相容性,感覺也沒多大的區別,對ie有相容性的就打消使用的想法了。 在nodejs上使用倒還是可以的。

symbol的瀏覽器相容性,**來自mdn

iechrome

edge

safari

android webview

ios safari

nodejs

11+38+

12+9+

38+9+

0.12+

weakmap的瀏覽器相容性,**來自mdn

iechrome

edge

safari

android webview

ios safari

nodejs

11+36+

12+8+

37+8+

0.12+

Babel下的ES6相容性與規範

自 es6特性 相容性箭頭函式 支援類的宣告和繼承 部分支援,ie8不支援 增強的物件字面量 支援字串模板 支援解構 支援,但注意使用方式 引數預設值,不定引數,拓展引數 支援let與const 支援for of ie不支援 iterator,generator 不支援模組 module proxi...

ES6的私有方法

const sayhello symbol class student dosomething sayhello 如上sayhello可以作為乙個私有方法。但是嘗試了一下sayhello在例項化的那個頁面也可以訪問。雖然是作為symbol,但是給人感覺也比較奇怪,因為其他地方也可能會用到 sayhe...

ES6 變數與解構 二

一 變數的宣告與使用 測試示例需要在node環境中測試,瀏覽器環境下並不完全相容es6 es6中可以使用 來包含任意一段 被 包裹的內容稱為乙個 塊 區域性作用域 let關鍵字 宣告變數 特性 1.塊級作用域 區域性作用於宣告的 塊中 2.變數宣告不會提公升 變數未宣告前無法使用該變數 3.暫時性死...