1、與函式一樣,類也可以使用表示式的形式定義。
const myclass =class me};
這個類的名字是myclass
而不是me
,me
只在class的內部**可用,指代當前類。
如果類的內部沒用到的話,可以省略me
,也就是可以寫成下面的形式。
2、採用class表示式,可以寫出立即執行的class。
let person = newclass
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)
//...};
上面**中,bar
和snaf
都是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...