ES6中的class

class

class是一个语法糖,其底层还是通过 构造函数 去创建的。

classfunction都可以作为构造函数,通过new操作符来实例化。

constructor 方法

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

class Person {
    constructor(name) {
        this.name = name;
    }
}

const usr = new Person('Jack');
console.log(usr); // Person { name: 'Jack' }

定义类的时候,前面不需要加 function, 而且方法之间不需要逗号分隔,加了会报错。

类的所有方法都定义在类的prototype属性上面。

class A {
constructor() {}
toString() {}
toValue() {}
}
// 等同于
function A () {
// constructor
};
A.prototype.toString = function() {};
A.prototype.toValue = function() {};

在类的实例上面调用方法,其实就是调用原型上的方法。

let a = new A();
a.constructor === A.prototype.constructor // true

类的实例

实例的属性除非显式定义在其本身(即定义在this对象上),否则都是定义在原型上(即定义在class上)。

注意:

  1. class不存在变量提升

new A(); // ReferenceError
class A {}

因为 ES6 不会把类的声明提升到代码头部。这种规定的原因与继承有关,必须保证子类在父类之后定义。

{
let A = class {};
class B extends A {}
}

静态方法

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

class A {
static classMethod() {
return 'hello';
}
}
A.classMethod();
console.log(A.classMethod());
// 'hello'
const a = new A();
a.classMethod();
// TypeError: a.classMethod is not a function

静态属性

静态属性指的是 Class 本身的属性,即Class.propName,而不是定义在实例对象(this)上的属性。

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

继承

Class 可以通过extends关键字实现继承

class Animal {}
class Cat extends Animal { };

阅读剩余
THE END