注册 登录

清河洛

javascript中的面向对象的继承

qingheluo2016-12-16清河洛443
在ES5中是通过原型链的形式实现继承的function Box(){this.name = 'Lee';}//Box构造 function Desk(){this.age = 100;}//Desk构造 Desk.prototype = new Box(); //Desc继承了Box,通过原型,形成链条在ES6的类中,使用extends关键字实现继承,让子类继承父类的属性和方法class Father { ... } class Sun extends Father { ... }super()方法表示父类的构造函数,用来新建一个父类的实例对象super对象表示父类的...

在ES5中是通过原型链的形式实现继承的

function Box(){this.name = 'Lee';}//Box构造
function Desk(){this.age = 100;}//Desk构造
Desk.prototype = new Box(); //Desc继承了Box,通过原型,形成链条

在ES6的类中,使用extends关键字实现继承,让子类继承父类的属性和方法

class Father { ... }
class Sun extends Father { ... }

super()方法表示父类的构造函数,用来新建一个父类的实例对象

super对象表示父类的实例,在静态方法中表示父类

class Father { ... }
class Sun extends Father { 
    constructor(){
        super();    // 调用父类的constructor()创建父类实例对象
        this.x = 1; // this指向子类的实例对象
    }
    run(){
        console.log("new val" + super.run());
            // super.run()表示调用父类的run方法
    }
}

ES6规定子类必须在constructor()方法中调用super()方法,否则就会报错

因为子类自己的this对象,必须先通过父类的构造函数完成塑造,然后再添加子类自己的实例属性和方法

如果不调用super()方法,子类就得不到自己的this对象

ES5的继承机制,是先创造一个独立的子类的实例对象,然后再将父类的方法添加到这个对象上面,即“实例在前,继承在后”

ES6的继承机制,是先将父类的属性和方法,加到一个空的对象上面,然后再将该对象作为子类的实例,即“继承在前,实例在后”

如果子类没有定义constructor()方法,默认添加构造函数,并且里面会调用super()

父类私有的属性和方法是不会被子类继承的,也就是说私有属性只能在定义它的 class 里面使用

Object.getPrototypeOf():获取一个类的父类

Object.getPrototypeOf(Sun) === Father;  // true


网址导航