ES6-21.class基本语法

1.简介(详情参考)

class是构造函数的语法糖。

class的constructor方法内的实现,就是原来构造函数的实现。

class内的所有方法都是在prototype上的,就是原来构造函数的prototype上的实例共享方法。

class A {
    constructor() {}
    addNum() {}
}
Object.keys(A.prototype); // []
// 等同于
function B() {};
B.prototype = {
    constructor() {},
    addNum() {}
}
Object.keys(B.prototype); // ["constructor", "addNum"]

⚠️对于访问内部函数有差别:class内部定义的函数不可遍历,构造函数的可以遍历。👆的Object.keys()方法。

2.constructor方法

class必须有constructor方法。如果不写,js引擎会自动添加constructor方法。

class A{}
// 等于
class A{
    constructor() {} // 空的方法
};

constructor方法默认返回this; 也可以自定义return对象,如果return原始数据,则忽略。

和构造函数区别: 必须有new,否则报错;

对于子类,必须在constructor方法中调用super()方法,否则无法访问this。如果不写constructor方法,则系统会默认

    constructor(...args) {
        super(...args);
    }

3. prototype和__proto__

class作为构造函数的语法糖,既有对象的__proto__属性,也有函数的prototype属性。

示例:

class A {
}
class B extends A {
}

B继承A,其实分两部分继承,一部分是实例属性和方法的继承,一部分是静态属性和方法的继承;

// 静态属性的继承
Object.setPrototypeOf(B, A);
// 实例属性的继承
Object.setPrototypeOf(B.prototype, A.prototype);
// 其中setPrototypeOf 的方法实现如下:
// function setPrototypeOf(x,y) {
//     x.__proto__ = y;
// }

通过上面的定义可以知道:

B.__proto__ === A;
B.prototype.__proto__ === A.prototype;
B.__proto__.__proto__ === A.__proto__;

PS :ES5中通过setPrototypeOf,Object.create()来实现继承;

ES6通过extends

 

posted @ 2019-09-19 15:53  Lyra李  阅读(193)  评论(0编辑  收藏  举报