class的基本操作方法
JavaScript語言中,生成例項物件的傳統方法是通過建構函式
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);
基本上,ES6的class可以看作只是一個語法糖,它的絕大部分功能,ES5都可以做到,新的class寫法只是讓物件原型的寫法更加清晰、更像面向物件程式設計的語法而已。上面的程式碼用ES6的class改寫。
//定義類 class Point{ constructor(x,y){ this.x = x; this.y = y; } toString(){ return '(' + this.x + ', ' + this.y + ')'; } }
上面程式碼定義了一個類,可以看到裡面有一個constructor方法,這就是構造方法,而this關鍵字則代表例項物件。也就是說ES5的建構函式point,對應ES6的point類的構造方法。
Point類除了構造方法,還定義了一個toString方法。注意,定義類的方法的時候,前面不需要加上function這個關鍵字,直接把函式定義放進去就可以了。另外,方法之間不需要逗號分割,加了會報錯。
ES6的類,完全可以看作建構函式的另一種寫法。
class Point{ //... } typeof Point//function Point === Point.prototype.constructor//true;
上面程式碼表明,類的資料型別就是函式,類本身就指向建構函式。
使用的時候,也就是直接對類使用new命令,跟建構函式的用法完全一致。
class Bar{ doStuff(){ console.log('stuff'); } } var b = new Bar(); b.doStuff();
建構函式的prototype屬性,在ES6的類上面繼續存在。事實上,類的所有方法都定義在類的prototype屬性上面。
class Point{ constructor(){} toString(){} toValue(){} } //等同於 Point.prototype = { constructor(){}, toString(){}, toValue(){}, }
在類的例項上面呼叫方法,其實就是呼叫原型上的方法。
class B{} let b = new B{}; b.constructor === B.prototype.constructor;
上面程式碼中,b是B類的例項,它的constructor方法就是B類原型的constructor方法。
由於類的方法都定義在prototype物件上面,所以類的新方法可以新增在prototype物件上面。Object.assign方法可以很方便地一次向類新增多個方法。
class Point{
constructor(){}
}
Object.assign(Point.prototype,{
toString(){}, toValue(){}
})
prototype物件的constructor屬性,直接指向類的本身,這與ES5的行為是一致的。
Point.prototype.constructor === Point//true.
另外,類的內部所有定義的方法,都是不可列舉的。
class Point{ constructor(x,y){} toString(){} } Object.keys(Point.prototype); Object.getOwnPropertyName(Point.prototype);
上面程式碼中,toString方法是Point類內部定義的方法,它是不可列舉的。這一點與ES5的行為不一致。
var Point = function(x,y){} Point.prototype.toString=function(){} Object.keys(Point.prototype); //["toString"] Obejct.getOwnPtopertyName(Point.prototype) //["constructor","toString"]
上面程式碼採用ES5的寫法,toString方法就是可列舉的。
類的屬性名,可以採用表示式。
let methodName = 'getArea'; class Square{ constructor(length){} [methodName](){} }
Square類的方法名getArea,是從表示式得到的。
原文地址:https://segmentfault.com/a/1190000017212581