新的class寫法只是讓對象原型的寫法更加清晰、更像面向?qū)ο缶幊痰恼Z法而已。
傳統(tǒng)的寫法
<script>
function People(name){
this.name=name;
}
People.prototype.sayName=function(){
console.log(this.name);
}
var p=new People('zl');
p.sayName(); //zl
</script>
class ES6新寫法
<script>
class People{ //class開頭寫,
constructor (name){ //當(dāng)使用new來創(chuàng)建對象,會自動調(diào)用這個函數(shù)
this.name=name
}
sayName(){ //共享的方法(方法會掛載到原型身上)
console.log(this.name)
}
}
var p=new People('zl');
p.sayName(); //zl
</script>
ES6的類,完全可以看作構(gòu)造函數(shù)的另一種寫法
constructor中的屬性和方法會自動調(diào)用,sayName中的方法會掛載到原型上,實(shí)現(xiàn)共享
注意:class沒有提升
私有方法:
_bar(baz) {
return this.snaf = baz;
}
上面代碼中,_bar方法前面的下劃線,表示這是一個只限于內(nèi)部使用的私有方法。但是,這種命名是不保險的,在類的外部,還是可以調(diào)用到這個方
法。
class 里的繼承 extends super
extends [iks?tendz] 延長延續(xù)
語法:
class Cat extends Animal{}
定義一個Cat類,該類通過extends關(guān)鍵字,繼承了Animal類的所有屬性和方法。
例子
class Cat extends Animal{
constructor(x,y,name){
super(x,y);
this.name=name
}
}
注意:
子類必須在constructor方法中調(diào)用super方法,否則新建實(shí)例時會報錯。這是因?yàn)樽宇悰]有自己的this對象,而是繼承父類的this對象,然后對其進(jìn)行加工。如果不調(diào)用super方法,子類就得不到this對象。
ES5 的繼承,實(shí)質(zhì)是先創(chuàng)造子類的實(shí)例對象this,然后再將父類的方法添加到this上面(Parent.apply(this))。
ES6 的繼承機(jī)制完全不同,實(shí)質(zhì)是
先創(chuàng)造父類的實(shí)例對象this(所以必須先調(diào)用super方法),然后再用子類的構(gòu)造函數(shù)修改this。
靜態(tài)方法 static
class People {
static print(){
console.log(100)
}
}
var p = new People();
p.print()//報錯
所有在類中定義的方法,都會被實(shí)例繼承。如果在一個方法前,加上static關(guān)鍵字,就表示該方法不會被實(shí)例繼承。而是直接通過類來調(diào)用,這就稱為“靜態(tài)方法”
這能這樣調(diào)用
People.print();
父級的靜態(tài)方法可以被子級繼承
繼承后子級可以調(diào)用父級的方法
class Foo {
static classMethod() {
console.log('我被繼承了');
}
}
class Bar extends Foo {
}
Bar.classMethod();
ES6規(guī)定class只有靜態(tài)方法沒有靜態(tài)屬性。