ES5的继承方法可以看这篇:ES5写继承的思路
ES5与ES6的继承方法对照:
ES5
function Parent() {
this.name = 'parent';
this.arr = [1,2,3,4];
}
Parent.prototype.say = function () {
console.log('say');
};
function Child(age) {
Parent.call(this);
this.age = age;
}
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;
var c = new Child(12);
console.log(c.name); //输出parent
c.say(); //输出say
console.log(c.constructor); //输出function Child(age) {Parent.call(this);this.age = age;}
console.log(new Parent().constructor); //输出Parent() {this.name = 'parent';this.arr = [1,2,3,4];}
ES6
class Parent2 {
constructor() {
this.name = 'parent';
}
}
Parent2.prototype.say = function () {
console.log('say');
};
class Child2 extends Parent {
constructor(age) {
super();
this.age = age;
}
}
var c2 = new Child2(12);
console.log(c2.name); //输出parent
c2.say(); //输出say
console.log(c.constructor); //输出function Child(age) {Parent.call(this);this.age = age;}
console.log(new Parent().constructor); //输出Parent() {this.name = 'parent';this.arr = [1,2,3,4];}
- ES5的继承实质上是先创建子类的实例对象,然后再将父类的方法添加到this上(Parent.apply(this)),然后再把原型链继承。
- ES6的继承机制完全不同,实质上是先创建父类的实例对象this(所以必须先调用父类的super()方法,才可使用this关键字,否则报错。),然后再用子类的构造函数修改this实现继承。
ps:es5及以下无法完美继承array,相关内容可自行搜索
后续
最近在看《javascript高级程序设计》,看到class这里尝试了一下模拟ES6中Class的继承
function Person() {
this.name = 'henry'
}
class Child extends Person { }
console.log(new Child())
class Child1 { }
let child1 = Object.create(Object.create(Person.prototype))
Object.defineProperty(Object.getPrototypeOf(child1), 'constructor', {
enumerable: false,
value: Child1
})
Person.call(child1)
console.log(child1)
执行结果如下:
因为Class无法直接使用constructor来当函数使用,所以父类用函数来实现,反正结果的原型链是一致的,仅供参考