js ES6學習筆記 Class(2)

2021-09-09 02:27:30 字數 2029 閱讀 8729

1、與函式一樣,類也可以使用表示式的形式定義。

const myclass =class me 

};

這個類的名字是myclass而不是meme只在class的內部**可用,指代當前類。

如果類的內部沒用到的話,可以省略me,也就是可以寫成下面的形式。

2、採用class表示式,可以寫出立即執行的class。

let person = new

class

sayname()

}('張三');

person.sayname();

//"張三"

3、私有方法是常見需求,但 es6 不提供,只能通過變通方法模擬實現。

一種做法是在命名上加以區別。

class widget 

//私有方法

_bar(baz)

//...}

這種命名是不保險的,在類的外部,還是可以呼叫到這個方法。

另一種方法就是索性將私有方法移出模組,因為模組內部的所有方法都是對外可見的。

class widget 

//...}

function

bar(baz)

上面**中,foo是公有方法,內部呼叫了bar.call(this, baz)。這使得bar實際上成為了當前模組的私有方法。

還有一種方法是利用symbol值的唯一性,將私有方法的名字命名為乙個symbol值。

const bar = symbol('bar');

const snaf = symbol('snaf');

export

default

class myclass

//私有方法

[bar](baz)

//...};

上面**中,barsnaf都是symbol值,導致第三方無法獲取到它們,因此達到了私有方法和私有屬性的效果。

4、類的方法內部如果含有this,它預設指向類的例項。但是,必須非常小心,一旦單獨使用該方法,很可能報錯。

class logger `);

} print(text)

}const logger = new

logger();

const =logger;

printname();

//typeerror: cannot read property 'print' of undefined

如果將這個方法提取出來單獨使用,this會指向該方法執行時所在的環境,因為找不到print方法而導致報錯。

乙個比較簡單的解決方法是,在構造方法中繫結this,這樣就不會找不到print方法了。

class logger 

//...}

另一種解決方法是使用箭頭函式。

class logger `);

};}

//...

}

還有一種解決方法是使用proxy,獲取方法的時候,自動繫結this

5、類和模組的內部,預設就是嚴格模式,所以不需要使用use strict指定執行模式。只要你的**寫在類或模組之中,就只有嚴格模式可用。

6、name屬性總是返回緊跟在class關鍵字後面的類名。

class point {}

point.name

//"point"

js ES6學習筆記 Class(5)

2 es6允許繼承原生建構函式定義子類,因為es6是先新建父類的例項物件this,然後再用子類的建構函式修飾this,使得父類的所有行為都可以繼承。下面是乙個繼承array的例子。class myarray extends array var arr new myarray arr 0 12 arr...

js ES6學習筆記 Proxy

1 proxy 用於修改某些操作的預設行為,等同於在語言層面做出修改,所以屬於一種 元程式設計 meta programming 即對程式語言進行程式設計。2 proxy 可以理解成,在目標物件之前架設一層 攔截 外界對該物件的訪問,都必須先通過這層攔截,因此提供了一種機制,可以對外界的訪問進行過濾...

js ES6學習筆記 Reflect

1 reflect物件與proxy物件一樣,也是 es6 為了操作物件而提供的新 api。reflect物件的設計目的有這樣幾個。2 reflect.get方法查詢並返回target物件的name屬性,如果沒有該屬性,則返回undefined。3 reflect.set方法設定target物件的na...