前言
初学js的时候我们肯定都被这三个关键字困扰过,之前也零零散散的总结过一些,但是都不成体系,实际写项目的时候用的又不多(用的框架,原生用的少),以至于知识点容易忘记,而且老用框架,而不去深究原理,始终浮于表面对成长不利,所以决定系统的整理一下,以便温习
定个基调
为apply,call存在的意义定个基调
call 和 apply 是为了改变某个函数运行时的上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向。
call和apply可以达到继承的效果
JavaScript 的一大特点是,函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」这样的概念。
改变this指向
理解一下下面代码,就是obj1的执行上下文被替换成obj的执行上下文,这个时候this从指向obj1,改成指向obj
let obj = {
name: "laowu",
}
let obj1 = {
name: 'laowan',
fn: function () {
console.log(this.name)
}
}
obj1.fn.call(obj) // laowu
对象继承,劫持别人的方法
理解一下下面的代码,Animal是父类型构造,Cat是子,cat里面本生是没有say方法的,但是通过call方法劫持了Animal的say方法,Animal的this会改变指向,指向Cat new出来的对象
function Animal(name){
this.say = function () {
console.log(name)
}
}
function Cat(name) {
Animal.call(this,name)
this.say()
}
let cat = new Cat("i am cat") //i am cat
网友评论