1.原型链继承
function Father(name) {
this.name = name || 'father';
}
Father.prototype.printName = function () {
console.log(this.name);
};
function Son() {}
Son.prototype = new Father();
//让如果要为子类新增原型属性和方法,则必须放在new Father()这样的语句之后执行
Son.prototype.constructor = Son;
let s = new Son();
2.构造继承
function Father(name) {
this.name = name || 'father';
}
Father.prototype.printName = function () {
console.log(this.name);
};
function Son(name) {
Father.call(this, name);
}
let s = new Son('son');
console.log(s.name); //son
s.printName(); //报错;因为只能继承父类的实例属性和方法,不能继承原型属性/方法
3.组合继承
function Father(name) {
this.name = name || 'father';
}
Father.prototype.printName = function () {
console.log(this.name);
};
function Son(name) {
Father.call(this, name);
}
//在call()方法和Son.prototype = new Father();两次都调用了父级的构造函数,造成了不必要的性能浪费。
Son.prototype = new Father();
Son.prototype.constructor = Son;
let s = new Son('son');
console.log(s.name);
s.printName();
4.es6继承
class Father {
constructor(name) {
this.name = name;
}
printName() {
console.log(this.name);
}
}
class Son extends Father {
constructor(name) {
super(name);
}
sayHello() {
console.log('hello');
}
}
let s = new Son('son');
console.log(s.name);
s.printName();
s.sayHello();