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属性