javascript的語言傳統(tǒng)方法是通過構(gòu)造函數(shù),定義并生成新的對象:
function point(x,y){
?this.x = x;
this.y = y;
}
point.prototype.toString = function(){
? return '('+this.x+this.y+')'
}
var ?p = ?new point(1,2);
p.toString();// (1,2)
es6提供了更接近傳統(tǒng)語言的寫法恕刘,引入了class(類)的概念,作為對象的模板温学。上面的代碼用es6可以改寫成如下方式:
class point {
constructor (x,y) {//構(gòu)造方法
//該方法是類默認(rèn)的方法,如果沒有顯示的聲明舷丹,一個空的構(gòu)造方法也會被默認(rèn)添加的葡幸。
? ?this.x = x;
? ?this.y = y;
}
toString () {
return '('+this.x+this.y+')'
}
toValue(){
}
}
point類除了構(gòu)造方法氓仲,還定義了一個toString方法。注意鳍烁,定義“類”的方法的時候叨襟,前面不需要加上function這個關(guān)鍵字,直接把函數(shù)定義放進(jìn)去了就可以了幔荒。另外糊闽,方法之間不需要逗號分隔梳玫,加了會報錯。
類的數(shù)據(jù)類型就是函數(shù)右犹,類本身就是指向構(gòu)造函數(shù)提澎。
使用的時候,也是直接對類使用new命令念链,跟構(gòu)造函數(shù)完全一致盼忌。
var m =new point(1,2);
m.toString();//(1,2)
構(gòu)造函數(shù)的prototype屬性,在es6的類上面繼續(xù)存在钓账。事實上類的所有方法都定義在這個屬性上面碴犬。
point.prototype = {
? ?toString(){},
? ?toValue(){}
}
在類的實例上調(diào)用,就是調(diào)用原型上的方法梆暮。
class B{}
let b = new B();
b.constructor === b.prototype.constructor //true
由于類的方法都定義在prototype對象上面服协,所有類的新方法的添加都可以通過這個對象添加。Object.assign方法可以很方便的一次向類添加多個方法啦粹。
class Point {
}
Object.assign(Point.prototype,{
toString(){},
toValue(){}
});
prototype對象的construcor屬性偿荷,直接指向類本身,另外唠椭,類內(nèi)部定義的方法是不可以枚舉的跳纳,在es5中是可以枚舉的。
與es5一樣贪嫂,實例的屬性除非顯示的定義在其本身(通過this)寺庄,否則都是定義在原型上的,即在class上面
//定義類 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?classPoint{constructor(x,y){this.x=x;this.y=y;}toString(){return'('+this.x+', '+this.y+')';}}
var point=newPoint(2,3);
point.toString()// (2, 3)
point.hasOwnProperty('x')// true
point.hasOwnProperty('y')// true
point.hasOwnProperty('toString')// false
point.__proto__.hasOwnProperty('toString')// true
class 不存在變量的提升 必須保證先聲明在前調(diào)用在后力崇,子類必須在父類的后面?
let Foo = class {}
class Bar extends Foo{//類的繼承
}
類的繼承 extends
class ColorPoint extends Point {
? constructor(x,y,color){
? ?super(x,y);//調(diào)用父類的構(gòu)造函數(shù)
? ?this.color = color;
? }
toString () {
return this.color+''+super.toString()//調(diào)用父級的方法
}
}
上面代碼中斗塘,constructor方法和toString方法之中,都出現(xiàn)了super關(guān)鍵字亮靴,它在這里表示父類的構(gòu)造函數(shù)馍盟,用來新建父類的this對象。子類必須在constructor方法中調(diào)用super方法茧吊,否則新建實例時會報錯贞岭。這是因為子類沒有自己的this對象,而是繼承父類的this對象搓侄,然后對其進(jìn)行加工瞄桨。如果不調(diào)用super方法,子類就得不到this對象讶踪。