JS語法中起始是原生不怎么支持面向?qū)ο蟮模械拿嫦驅(qū)ο笃鹪淳ㄟ^一個構(gòu)造函數(shù)氨鹏,這一點和JAVA等語言原生支持面向?qū)ο蟮恼Z言有很大的不同嗽交。
通常生成一個對象的傳統(tǒng)方式就是通過構(gòu)造函數(shù),這也是JS唯一面向的對象唯一起點捕传。
function Point(x, y){
this.x = x;
this.y = y;
}
Point.prototype.toString = function(){
return '(' + this.x + ', ' + this.y + ')';
};
var p = new Point(1,3);
注意 這時ES5的原生寫法筐骇, 在接下來的篇幅我們會詳細接受ES6中 關(guān)鍵字CLASS的使用方法债鸡。
在ES6中使用class和 es6其實再本質(zhì)上沒有任何的區(qū)別,都是通過構(gòu)造函數(shù)來做文章铛纬,只不過class的使用更符合類似向我這種通過JAVA轉(zhuǎn)過來的使用習慣厌均。
class Point{
constructor(x, y){
this.x = x;
this.y = y;
}
toString(){
return '(' + this.x + ', ' + this.y + ')';
}
}
基本上來講 class已經(jīng)是構(gòu)造函數(shù)的另外一種寫法,有幾點不同之處在于
class中的函數(shù) 基本不用逗號來區(qū)別
Constructor toString 等方法都不需要加上function 直接起一個函數(shù)名并 定義其中方法即可
class Point{
}
typeof Point // function
Point === Point.prototype.constructor // true
在構(gòu)造函數(shù)的prototype屬性告唆,在ES6的類上面繼續(xù)存在棺弊,實際上所有定義再類的方法都是定義再類的prototype熟悉上面。
調(diào)用類的實例上面的方法其實就是調(diào)用原型的方法擒悬。
ES6與ES5不同之處在于 所有定義在class的方法都是不可枚舉的模她,但是所有ES5 prototype上的方法都是可枚舉的。
- 嚴格模式
類和模塊的內(nèi)部懂牧,默認都是嚴格模式侈净,所以不需要 use strict來指定運行模式。起始ES6已經(jīng)慢慢的將整個語言提升為嚴格模式了
- 類的實例對象
與ES5一樣僧凤,實例的屬性除非顯示定義再其本身(this對象上)畜侦,否則都是定義在原型上。
class Point{
constructor(x, y){
this.x = x;
this.y = y;
}
toString(){
return '(' + this.x + ',' + this.y + ')';
}
}
var point = new Point(2, 3);
point.toString(); /// (2躯保, 3)旋膳;
point.hasOwnProperty('x'); // true
point.hasOwnProperty('y'); // true
point.hasOwnProperty('toString'); // false 定義再Point的原型對象上
point.proto.hasOwnProperty('toString'); // true 對象的原型對象 proto
所有的類的實例共享一個原型對象 這意味可以通過實例的 proto 屬性添加方法
- this的指向
js最讓人頭疼的便是this的指向途事, 在類的方法內(nèi)部如果含有this验懊,它默認指向類的實例。但是尸变,一旦單獨來使用該方法鲁森,this很可能會改變
class Logger{
printName(name = 'there'){
this.print(Hello ${name}
);// 1. 默認this指向的是Logger的實例
}
print(text){
console.log(text);
}
}
const logger = new Logger();
const {printName} = logger();
printName();// 2. 因為在調(diào)用函數(shù) 導致this 丟失了
因為語言設計的緣故導致this會指向該方法運行的所在的環(huán)境,
解決方案一般有兩種:
講方法綁定 再構(gòu)造方法中綁定this 振惰,這樣就不會找不到print方法
第二種解決方法是使用箭頭函數(shù)
- Class的getter setter方法
通過使用類 可以使用get和set關(guān)鍵字,對某個屬性設置存值函數(shù)和取值函數(shù)垄懂,攔截該屬性的存取行為
- Class的靜態(tài)方法
類的靜態(tài)方法只能通過類來調(diào)用
父類的靜態(tài)方法骑晶,可以被子類繼承
鏈接:http://www.reibang.com/p/40e92342e81d
來源:簡書
著作權(quán)歸作者所有痛垛。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處桶蛔。