🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
#### `constructor`方法 * `constructor`方法是类的默认方法,通过`new`命令生成对象实例时,自动会调用该方法,一个类必须有`constructor`方法,如果没有显式定义,一个空的`constructor`会被默认添加 ~~~ class A{} 等同于 class A{ constructor(){} } ~~~ * constructor方法默认返回实例对象(即`this`),我们完全可以指定返回另一个对象 ~~~ class Foo{ constructor(){ return Object.create(null); } } new Foo() instanceof Foo // false → constructor返回了一个全新的对象,导致实例对象不再是Foo类的实例 ~~~ * 实例的属性除非显式定义在其本身(即定义在`this`上),否则都是定义在原型上 ~~~ class A{ constructor(x, y){ this.x = x this.y = y this.getA = function(){ console.log('A') } } toString(){ return '(' + this.x + ', ' + this.y + ')' } } var a = new A(2,3) point.toString(); // (2,3) point.hasOwnProperty('x') // true point.hasOwnProperty('y') // true point.hasOwnProperty('getA') // true point.hasOwnProperty('toString') // false point.__proto__.hasOwnProperty("toString") // true 复制代码 ~~~ > x、y、getA都是实例对象a自身的属性(因为定义在this变量上),所以hasOwnProperty方法返回true ,而toString是原型对象的属性(因为定义在A类上),所以hasOwnProperty方法返回false * 与`Es5`一致,类的所有实例也共享一个原型对象 ~~~ var p1 = new Person('chicago') var p2 = new Person('Amy') p1.__proto__ === p2.__proto__ // true - p1 / p2 都是Person的实例,它们的原型都是`Person.prototype`,所以`__proto__`自然是相同的 - 这也意味着可以通过实例的`__proto__`属性为'类'添加方法 p1.__proto__.getName = function(){ return 'i get name' } p1.getName() // i get name p2.getName() // i get name var p3 = new Person('Jack') p3.getName() // i get name ~~~ #### Class中的 getter / setter * 与`Es 5`一样,在'类'的内部可以通过使用`get`和`set`关键字,对**某个属性**设置存值函数与取值函数 ~~~ class A{ constructor(){ //... } get prop(){ return 'getter' } set prop(value){ console.log('setter:' + value) } } let a = new A() a.prop = 123 // setter:123 a.prop // getter 这里`prop`属性有对应的存值函数和取值函数。因此赋值和读取行为都被自定义了 ❗ Ps - 存值函数和取值函数是设置在属性的Descriptor对象上的 ~~~