原型链的继承
缺点不能给父类的属性传递参数
function Father(name, age) {
this.name = name
this.age = age
}
Father.prototype.say = function () {
console.log('我是父亲');
}
function Son(like) {
this.like = like
}
Son.prototype = new Father('zs', 18)
Son.prototype.constructor = Son
let p = new Son('篮球')
p.say()
console.log(p);
构造函数的继承
无法继承父亲的方法,可以给父类的属性传递参数
function Father(name, age) {
this.name = name
this.age = age
}
Father.prototype.say = function () {
console.log('我是父亲');
}
function Son(name, age, like) {
Father.call(this, name, age)
this.like = like
}
let p = new Son('zs', 18, '篮球')
console.log(p);
构造函数和原型链联合使用
缺点会调用两次构造函数,生成两个对象空间,浪费内存
function Father(name, age) {
this.name = name
this.age = age
console.log('111');
}
Father.prototype.say = function () {
console.log('我是父亲');
}
function Son(name, age, like) {
Father.call(this, name, age)
this.like = like
}
Son.prototype = new Father()
Son.prototype.constructor = Son
let p = new Son('zs', 18, '篮球')
console.log(p);
完美解决方案: 借用寄生改造函数
不会调用两次 Father ,只会调用一次
function Father(name, age) {
this.name = name
this.age = age
console.log('111');
}
Father.prototype.say = function () {
console.log('我是父亲');
}
function Son(name, age, like) {
Father.call(this, name, age)
this.like = like
}
function Test() {
}
Test.prototype = Father.prototype
let newObj = new Test()
Son.prototype = newObj
let p = new Son('zs', 15, '篮球')
p.say()
console.log(p);
ES6的方法:
完美
class Father {
constructor(name, age) {
this.name = name
this.age = age
return this
}
say() {
console.log('我是父亲');
}
}
class Son extends Father {
constructor(name, age, like) {
super(name, age)
super.say()
this.like = like
}
}
let p = new Son('zs', 18, '篮球')
console.log(p);
p.say()