微信图片_20190611223220.jpg

#

1. 原型链继承

从父级上继承,但是有个问题,如果有多个子类同时继承一个父类,如果改变其中一个子类,其余子类也会跟着改变,这种情况就和数组对象的浅拷贝一样。

function parents(){
    this.name = ['fuqin']
}

parents.prototype.getName = function() {
    console.log(this.name)
}

function child(){}

child.prototype = new parents()

let child1 = new child()

child1.getName() // ['fuqin']

let child2 = new child()

child1.name.push('haha')

let child3 = new child()

child1.getName() //  => ['fuqin', 'haha']
child2.getName() //  => ['fuqin', 'haha']
child3.getName() //  => ['fuqin', 'haha']

2. 构造函数继承

改进了原型链继承的缺点,不会因为某个实例的更改而导致所有继承实例的变化,但是也有它的缺点就是每次创建实例都会创建一遍方法。

function parents(){
    this.name = ['brother']
}

function child(){
    parents.call(this)
}

let child1 = new child()
let child2 = new child()

child1.name.push('haah')

let child3 = new child()

console.log(child1.name) // => ['brother', 'haah']
console.log(child2.name) // => ['brother']
console.log(child3.name) // => ['brother']

// 在构造函数继承中还可以通过call()传递参数

function parents(name){
    this.name = name
}

function child(name){
    parents.call(this,name)
}

let child1 = new child('hh,我是1')
let child2 = new child('hh,我是2')

child1.name // => 'hh,我是1'
child2.name // => 'hh,我是2'