function Person(name) {
this.name = name;
}
Person.prototype.sayHello = function(){
return 'Hi, I am ' + this.name;
}
/*這是es5中 主流建立對象的方法之一,方法寫在原型鏈中*/ 複製代碼
而用ES6的寫法重寫一下,檢測類型發現Person本質上仍然是函數:
es6
class Person {
//先建立構造函數
constructor(name){
this.name = name;
}
sayHello(){
return 'Hi, I am ' + this.name;
}
}複製代碼
typeof Person; //'function'複製代碼
調用的方式都是一致的:
bash
var me = new Person('Jason'); 複製代碼
用ES6定義class中的方法,定義在原型對象上的。與ES5不一樣的是,這些定義在原型對象的方法是不可枚舉的。數據結構
ES6類和模塊是嚴格模式下的;函數
不存在變量提高,保證子類父類的順序;ui
類的繼承也有新的寫法:this
class Female extends Person {
constructor(name){
super(name); //調用父類的,調用以後,子類纔有this
this.gender = 'female';
}
sayHello(){
return super.sayHello() + ', I am ' + this.gender;
}
}複製代碼
注意點,子類必須在父類的構造函數中調用super(),這樣纔有this對象,由於this對象是從父類繼承下來的。而要在子類中調用父類的方法,用super關鍵詞可指代父類。 ES5中類繼承的關係是相反的,先有子類的this,而後用父類的方法應用在this上。 ES6類繼承子類的this是從父類繼承下來的這個特性,使得在ES6中能夠構造原生數據結構的子類,這是ES5沒法作到的。 ES6也能夠定義類的靜態方法和靜態屬性,靜態的意思是這些不會被實例繼承,不須要實例化類,就能夠直接拿來用。ES6中class內部只能定義方法,不能定義屬性。在方法名前加上static就表示這個方式是靜態方法,而屬性仍是按照ES5的方式來實現。
es5
// ES5寫法
Person.total = 0; //靜態屬性
Person.counter = function(){ //靜態方法
return this.total ++ ;
}
// ES6寫法
class Person {
...
static counter(){
return this.total ++ ;
}
}
Person.total = 0;複製代碼
ES6中當函數用new關鍵詞的時候,增長了new.target屬性來判斷當前調用的構造函數。這個有什麼用處呢?能夠限制函數的調用,好比必定要用new命令來調用,或者不能直接被實例化須要調用它的子類。
spa
function Person(name){
if(new.target === Person){
this.name = name;
}
else{
throw new Error('必須用new生成實例');
}
}複製代碼