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