js call/apply 封装实现

call

改变 this指向

function test(){

}
test()// 调用函数 等同于 test.call()

传参 this指向 第一个参数(对象)

var obj = {
	name:'obj',
	obb:function(age){
		console.log(this.name,age)
	}
}
var obj2 = {
	name:"obj2"
}
obj.obb(2);// 'obj' 2
obj.obb.call();// undefined ??
obj.obb.call(2);// undefined undefined??
obj.obb.call(obj2,2); //"obj2" 2

借别人的方法来构造自己的函数


function Per(name,age){
	this.name = name;
	this.age = age;
}
var obj = {}
Per.call(obj,'obj',18);
console.log(obj);//{name: "obj", age: 18}

function Per(name,age){
	this.name = name;
	this.age = age;
}
function Stu(name,age,sex,tel){
	// this = {}
	Per.call(this,name,age)
	// this = {name:'',age:''}
	this.sex = sex;
	this.tel = tel;
}
var stu = new Stu('stu',18,'male',110);
console.log(stu);//{name: "stu", age: 18, sex: "male", tel: 110}

apply

改变 this指向
apply和call区别 传参列表不同
this 是对象
call 需要把实参按照形参的个数传进去 (this,x1,x2,…)
apply 需要传一个 实参数组arguments (this,arguments)

function Per(name,age){
	this.name = name;
	this.age = age;
}
var obj = {}
Per.apply(obj,['name',18])
console.log(obj);//{name: "name", age: 18}

call/apply 封装实现

Function.prototype.myCall = function(target=window,...args){
  	if (typeof this !== "function") throw new Error('type error')
  	var fun = Symbol() 
    target[fun] = this
    const val = target[fun](...args)
    delete target[fun]
    return val
}

Function.prototype.myApply = function(target=window,arr){
	if (typeof this !== "function") throw new Error('type error')
    target.fun = this
    const val = target.fun(...arr)
    delete target.fun
    return val
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值