更新時(shí)間:2021-07-21 來源:黑馬程序員 瀏覽量:
class 的寫法只是語法糖,和之前 prototype 差不多,但還是有細(xì)微差別的,下面看看:
嚴(yán)格模式
類和模塊的內(nèi)部,默認(rèn)就是嚴(yán)格模式,所以不需要使用use strict指定運(yùn)行模式。只要你的代碼寫在類或模塊之中,就只有嚴(yán)格模式可用。考慮到未來所有的代碼,其實(shí)都是運(yùn)行在模塊之中,所以 ES6 實(shí)際上把整個(gè)語言升級到了嚴(yán)格模式。
不存在提升
類不存在變量提升(hoist),這一點(diǎn)與 ES5 完全不同。
new Foo(); // ReferenceError class Foo {}
方法默認(rèn)是不可枚舉的
ES6 中的 class,它的方法(包括靜態(tài)方法和實(shí)例方法)默認(rèn)是不可枚舉的,而構(gòu)造函數(shù)默認(rèn)是可枚舉的。細(xì)想一下,這其實(shí)是個(gè)優(yōu)化,讓你在遍歷時(shí)候,不需要再判斷 hasOwnProperty 了
class 的所有方法(包括靜態(tài)方法和實(shí)例方法)都沒有原型對象 prototype,所以也沒有[[construct]],不能使用 new 來調(diào)用。
class 必須使用 new 調(diào)用,否則會報(bào)錯(cuò)。這是它跟普通構(gòu)造函數(shù)的一個(gè)主要區(qū)別,后者不用 new 也可以執(zhí)行。
ES5 和 ES6 子類 this 生成順序不同
ES5 的繼承先生成了子類實(shí)例,再調(diào)用父類的構(gòu)造函數(shù)修飾子類實(shí)例。ES6 的繼承先 生成父類實(shí)例,再調(diào)用子類的構(gòu)造函數(shù)修飾父類實(shí)例。這個(gè)差別使得 ES6 可以繼承內(nèi)置對象。
ES6可以繼承靜態(tài)方法,而構(gòu)造函數(shù)不能