2

记录class的学习笔记,在回答别人的问题时发现自己的的理解误差很大

javascript的class

在没有es6带来的class的时候,我们编写JavaScript的时候很多时候会通过构造函数和原型链来添加方法属性,实现class的功能。

// Box是一个构造器
function Box(color) {
    this.type = 'circle';
    this.color = color;
}

// 我们可以通过prototype的方式来加一条实例方法
Person.prototype.hello = function() {
    console.log('hello ' + this.color);
}

// 对于私有属性(Static method),我们当然不能放在原型链上了。我们可以直接放在构造函数上面
Person.fn = function() {
    console.log('static');
};
//通过new来创建
var circle = new Box('red');

但是在es6的规范中,可以使用class语法,ES6 的class可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。上面的代码用 ES6 的class改写,就是下面这样。

class Box {
    constructor(color) {
        this.color = color;
        this.type="corcle"
    }
    hello() {
        console.log('hello ' + this.name);
    }
    static fn() {
        console.log('static');
    };
}

上面代码定义了一个“类”,可以看到里面有一个constructor方法,这就是构造方法,而this关键字则代表实例对象。

需要注意:
1.class内的方法不需要 function关键字,直接把函数定义放进去了就可以了。
2.另外,方法之间不需要逗号分隔,加了会报错。
3.class内部默认是严格模式,
需要注意这个和JavaScript中的对象写法是不一样的。而是看成是构造函数的写法。而且目前使用typeof来判断class的类型的时候返回的结果是function

constructor方法

constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。

class Box {
}

// 等同于
class Box {
  constructor() {}
}

类的实例对象

就像使用构造函数一样使用new命令来创建一个实例。如果忘记加上new,像函数那样调用Class,将会报错。

class Box{...}
var circle = new Box();

class的实例对象就和普通的对象类似,都是可以看过是通过new一个构造函数生成的,

这里有几个问题需要注意:

class表达式就像函数表达式一样,可以把class来赋值给变量,
class不存在变量提升,内部默认严格模式
暂时没有标准的支持私有方法和私有属性
this的指向是class实例对象,需要注意如果在外单独调用方法时需要小心this的指向
Generator函数前面添加*即可

静态属性和方法

静态方法

类相当于实例的原型,所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。
注意,如果静态方法包含this关键字,这个this指的是类,而不是实例。

静态属性

ES6 明确规定,Class 内部只有静态方法,没有静态属性。所以应该这样书写一个静态属性:

class Foo {
}

Foo.prop = 1;
Foo.prop // 1

下面是错误的举一反三:

// 以下两种写法目前都无效
class Foo {
  // 写法一
  prop: 2

  // 写法二
  static prop: 2
}

Foo.prop // undefined

新提案中的静态属性、实例属性

不过目前已经有了新的提案来支持类的静态属性和实例属性,

实例属性

类的实例属性可以用等式,写入类的定义之中。

class MyClass {
  myProp = 42;

  constructor() {
    console.log(this.myProp); // 42
  }
}
静态属性

类的静态属性只要在上面的实例属性写法前面,加上static关键字就可以了。

class MyClass {
  static myStaticProp = 42;

  constructor() {
    console.log(MyClass.myStaticProp); // 42
  }
}

caoweiju
1.5k 声望53 粉丝

class Myself {