群里有小伙伴面试遇到这个问题,这个初学js的时候,大家肯定都有研究过。无奈现在大环境都是各种使用第三方插件、框架。导致很多基础的东西都有些淡忘了,在此进行简单的记录与解释。
this继承最经典的当属利用apply与call这两个方法了,方法没什么区别,区别只在于参数是一个还是多个。
function Human(name) {
this.age = '14'
this.sex =' boy'
this.name = name
}
let people = {}
Human.call(people,'emiya')
// ---------------- 以上代码,实现了继承 -------------------
// 因为call调用了Human,并且将this指向了people,那么整个Human的执行过程就为这样:
function Human(name) {
people.age = '14'
people.sex =' boy'
people.name = name
}
简单理解就是,call或者apply方法,可以把所执行方法里面的this替换为你指定的对象(就是所谓的改变this指向)。这样的话,每次继承都会完全创建一些新的值,每个都是独立的。换句话就是说,你即便想复用一些属性也是不行的。
原型链继承一般是通过new来实现,如代码所示:
function Human(name) {
this.age = '14'
this.sex =' boy'
this.name = name
}
Human.prototype.hobby = 'song、jump、rap、basketBall'
let people = new Human('kun')
console.log(people.hobby) // song、jump、rap、basketBall
Human.prototype.hobby = 'pussy'
console.log(people.hobby) // pussy
首先我们设置了名为kun的人类,爱好一堆(此处设置为string,是为了防止可能由深拷贝带来误解,众所周知string为基础类型,每次创建或者赋值都会在堆栈中新开创空间)。当我们修改构造函数爱好的时候,kun的爱好也变为pussy。
没有建过多的对象来验证,因为本身是知道的,所以直接记录结论; 原型链继承,最终都是指向原本的构造函数的。也就是说,每次new一个新对象,实际并没有创建多个。
通过上面的说明,总结如下:
this所实现的继承是独立的,不会受到父的变化影响。继承多少次,就创建多少次新的属性。
原型链所实现的继承,指向都是指向构造函数的,也就是说所有继承者使用的都是同一个原型属性/方法。
利用这些特性我们在写构造函数的时候,公用方法可以使用原型链,基础属性可以使用this