1 class Point{ 2 constructor(x,y){ 3 this.x = x; 4 this.y = y; 5 } 6 toString(){ 7 return '(' + this.x + ',' + this.y + ')'; 8 } 9 } 10 var foo = new Point(2,3); 11 console.log(foo.x); 12 // es6類完全可以看作構造函數的另一種寫法 13 // type of "function" 14 // Point === Point.prototype.constructor true 15 16 // 構造函數的prototype屬性在es6的"類"上繼續存在,事實上類的所有方法都定義在類的 prototoye 屬性上 17 18 // 在類的實例上調用方法,其實就是調用類原型上的方法 19 20 // 類的內部定義的所有方法都是不可枚舉的 21 22 // 類和模塊的內部默認使用嚴格模式 23 24 // constructor是類的默認方法通過new命令生成實例對象時自動調用該方法. 25 26 // 一個類必須有constructor方法,如果沒有顯式定義,默認添加一個空的constructor方法 27 28 // 類必須使用new來調用,否則報錯 29 30 // 與es5一樣實例的屬性除非顯式定義在其本身(即this對象上),否則都是定義在原型(即class)上 31 32 // class表達式 33 34 const myClass = class Me{} 35 36 const foo = class{}; // 省略類名 37 38 // 類不存在變量提升 (與繼承有關) 39 40 // 必須在定義后使用,否則報錯 41 42 43 // this指向 44 45 // 類的方法內部如果含有this,它將默認指向類的實例 46 47 // class的取值函數getter和存值函數setter 48 49 // class的靜態方法 50 // 在一個方法前加上static關鍵字就表示該方法不會被實例繼承,而是直接通過類調用,稱為靜態方法 51 // 父類的靜態方法可以被子類繼承,靜態方法也可以從super對象上調用 52 53 // class 實例屬性/靜態屬性 54 // 在實例屬性寫法前面加上static關鍵字就可以了 55 56 // class的繼承 57 58 // class通過extends實現繼承 59 // super關鍵字表示父類的構造函數 60 // 子類必須在constructor方法中調用super方法,否則新建實例會報錯,這是因為子類沒有自己的this對象,而是繼承父類的this對象 61 class point {} 62 class colorPoint{ 63 constructor() { 64 super(); // 調用父類constructor方法 65 } 66 } 67 68 // 在子類的構造函數中只有調用super之后才可以使用this關鍵字,否則報錯 69 70 // super關鍵字 71 // super關鍵字及可以當作函數使用,也可以當作對象使用 72 // super作為函數使用時,代表調用父類的構造函數,只能在子類構造函數中使用,其他地方會報錯 73 // 第二種情況,super作為對象時在普通方法中指向父類的原型對象,在靜態方法中指向父類 74 // super調用父類的方法時,super會綁定子類的this 75 76 77 // 類的prototype屬性和__proto__屬性 78 // class作為構造函數的語法糖同時有prototype屬性和__proto__屬性,因此同時存在兩條繼承鏈 79 // 子類的__proto__屬性表示構造函數的繼承,總是指向父類 80 // 子類的prototype屬性的__proto__屬性表示方法繼承,總是指向父類prototype屬性