|
導讀網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立... 網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立在超文本基礎之上的。超級文本標記語言之所以稱為超文本標記語言,是因為文本中包含了所謂“超級鏈接”點。 本篇文章給大家帶來的內容是關于ES6中私有變量的實現總結(代碼示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。在閱讀 《ECMAScript 6 入門》的時候,零散的看到有私有變量的實現,所以在此總結一篇。 1. 約定實現class Example {
constructor() {
this._private = 'private';
}
getName() {
return this._private
}
}
var ex = new Example();
console.log(ex.getName()); // private
console.log(ex._private); // private優點
缺點
2. 閉包實現一/**
* 實現一
*/
class Example {
constructor() {
var _private = '';
_private = 'private';
this.getName = function() {return _private}
}
}
var ex = new Example();
console.log(ex.getName()); // private
console.log(ex._private); // undefined優點
缺點
實現二/**
* 實現二
*/
const Example = (function() {
var _private = '';
class Example {
constructor() {
_private = 'private';
}
getName() {
return _private;
}
}
return Example;
})();
var ex = new Example();
console.log(ex.getName()); // private
console.log(ex._private); // undefined優點
缺點
3. Symbol實現const Example = (function() {
var _private = Symbol('private');
class Example {
constructor() {
this[_private] = 'private';
}
getName() {
return this[_private];
}
}
return Example;
})();
var ex = new Example();
console.log(ex.getName()); // private
console.log(ex.name); // undefined優點
缺點
4. WeakMap實現/**
* 實現一
*/
const _private = new WeakMap();
class Example {
constructor() {
_private.set(this, 'private');
}
getName() {
return _private.get(this);
}
}
var ex = new Example();
console.log(ex.getName()); // private
console.log(ex.name); // undefined如果這樣寫,你可能覺得封裝性不夠,你也可以這樣寫: /**
* 實現二
*/
const Example = (function() {
var _private = new WeakMap(); // 私有成員存儲容器
class Example {
constructor() {
_private.set(this, 'private');
}
getName() {
return _private.get(this);
}
}
return Example;
})();
var ex = new Example();
console.log(ex.getName()); // private
console.log(ex.name); // undefined優點
缺點
5. 最新提案class Point {
#x;
#y;
constructor(x, y) {
this.#x = x;
this.#y = y;
}
equals(point) {
return this.#x === point.#x && this.#y === point.#y;
}
}那么為什么不直接使用 private 字段呢?比如說這樣: class Foo {
private value;
equals(foo) {
return this.value === foo.value;
}
}簡單點來說,就是嫌麻煩,當然也有性能上的考慮…… 舉個例子,如果我們不使用 #,而是使用 private 關鍵字: class Foo {
private value = '1';
equals(foo) {
return this.value === foo.value;
}
}
var foo1 = new Foo();
var foo2 = new Foo();
console.log(foo1.equals(foo2));在這里我們新建了兩個實例,然后將 foo2 作為參數傳入了 foo1 的實例方法中。 那么我們可以獲取 foo2.value 的值嗎?如果我們直接 答案是可以的。 其實這點在其他語言,比如說 Java 和 C++ 中也是一樣的,類的成員函數中可以訪問同類型實例的私有變量,這是因為私有是為了實現“對外”的信息隱藏,在類自己內部,沒有必要禁止私有變量的訪問,你也可以理解為私有變量的限制是以類為單位,而不是以對象為單位,此外這樣做也可以為使用者帶來便利。 既然獲取值是可以的,那么打印的結果應該為 true,但是如果我們傳入的值不是 Foo 的實例,而是一個其他對象呢? var foo1 = new Foo();
console.log(foo1.equals({
value: 2
}));當然這里代碼也是可以正常運行的,但是對于編譯器來說,就有一點麻煩了,因為編譯器不知道 value 到底是 foo 的正常屬性還是私有屬性,所以編譯器需要做判斷,先判斷 foo 是不是 Foo 的實例,然后再接著獲取值。 這也意味著每次屬性訪問都需要做這樣一個判斷,而引擎已經圍繞屬性訪問做了高度優化,懶得改,而且還降低速度。 不過除了這個工作之外,還會有一些其他的內容需要考慮,比如說:
關于使用 # 而不使用 private 更多的討論可以參考這個 Issue。 當然這些問題都可以被解決啦,就是麻煩了點。 而如果你選擇 #,實現的方式將跟 JavaScript 對象屬性完全沒有關系,將會使用 以上就是ES6中私有變量的實現總結(代碼示例)的詳細內容,更多請關注php中文網其它相關文章! 網站建設是一個廣義的術語,涵蓋了許多不同的技能和學科中所使用的生產和維護的網站。 |
溫馨提示:喜歡本站的話,請收藏一下本站!