js原生不支援私有變數,這讓前端開發很頭痛,如何實現私有變數對於程式的健壯十分重要。下面就講下私有變數的幾種實現,以及對應的babel外掛程式。
主要是講es6相關的symbol
和weakmap
,當然閉包也是可以實現的,本篇主要講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,需要自己手動加下plugin
babel-plugin-transform-private-properties,在右下角plugins
處新增即可
final
最後對比下symbol
與weakmap
的使用,其實兩者都實現了私有,並不想_
只是乙個標記而已(感覺就像babel
裡的設定為true
的loose
選項一樣)。 對比二者的相容性,感覺也沒多大的區別,對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.暫時性死...