基本概念
基本上,ES6 的class可以看作只是一個語法糖,它的絕大部分功能,ES5 都可以做到,新的class寫法只是讓對象原型的寫法更加清晰、更像面向對象編程的語法而已。
JS語言的傳統方法是通過構造函數定義并生成新對象的。是一種基于原型的面向對象系統。舉例來說:
const Foo = function(a,b) {
this.a = a;
this.b = b;
return this;
}
Foo.prototype = {
constructor: Foo,
print: function() {
console.log(this.a + '' + this.b);
}
}
const foo = new Foo('hello','world').print();//hello world
以上就是es5的寫法,下面用ES6對它進行改寫來熟悉class的基本用法:
class Foo {
constructor(a,b){
this.a = a;
this.b = b;
return this;
}
print() {
console.log(this.a +''+ this.b);
}
}
const foo = new Foo('hello','world').print();//hello world
下面來簡要的的說明一下:
- Foo 中的constructor方法是構造方法,this關鍵字則代表實例對象。也就是說,ES5的構造函數Foo,對應ES6的Foo這個類的構造方法。
2.Foo這個類除了構造方法還有一個print方法。注意定義‘類’的方法的時候,前面是不需要加上function這個關鍵字的。直接把函數定義放進去就好。方法之間是不需要加逗號的,加了都好會報錯。
3.構造函數的prototype屬性,在ES6的類上面繼續存在。而且類的所有方法都定義在類的prototype屬性上面。
console.log(Foo.prototype); //Object {constructor: function, print: function}
4.定義在類中的方法都是不可被枚舉的。
console.log(Object.keys(Foo.prototype));//[]
5.constructor方法是類的默認方法,通過new命令生成的對象實例時,自動調用該方法。一個類必須有constructor方法。如果沒有顯式的定義,一個空的constructor方法會被默認添加。
class Y{}; const y = new Y(); console.log(y);//function(){}一個空函數被創建就是因為默認添加了constructor
6.生成類的實例對象的寫法,與ES5完全一樣,也是實用new命令。如果忘記添加new,直接調用class,將會報錯。
以上都是個人理解如有不對之處還望指正交流!