call()
定义:
call()为函数中的一个方法, 其参数为一个指定的this值,以及一个参数列表
语法:
fn.call(thisArg, a,b,c)
- thisArg:在fu函数运行时指定this的值,如果指定为null或者undefined会指向全局对象,浏览器中就是window对象。
- a,b,c:参数列表,作为参数传给fu函数
也就是说call能使fn函数中的this指向其第一个参数thisArg对象
const obj1 = {
name: 'ahua',
getName(h1,h2) {
console.log(`我叫${this.name},喜欢${h1}和${h2}`);
}
};
const obj2 = {
name: '阿花'
};
obj1.getName.call(obj2,'读书','看报')
手写call()
- call支持多个参数,可能一个,可能一个也没有
- 多参数时要把thisArg外的参数传给扩展方法
- 结束后要把扩展的自定义函数删除
Function.prototype.mycall = function(context){
var context = context || window;
context.fn = this;
var args = [];
for (var i = 1, len = arguments.length; i < len; i++) {
args.push(arguments[i]);
}
const result = context.fn(...args);
delete context.fn;
return result;
}
obj1.getName.mycall(obj2,'读书','看报')
apply()
定义:
apply() 为函数的一个方法, 其参数为一个指定的this值,以及一个数组(或类似数组的对象)
语法:
fu.apply(thisArg, [argsArray])
- thisArg:在fu函数运行时指定this的值,如果指定为null或者undefined会指向全局对象,浏览器中就是window对象。
- arrgsArray:一个数组或者类数组对象,作为参数传给fu函数
apply也能使函数中的this指向其第一个参数thisArg对象
const obj1 = {
name: 'ahua',
getName(x,y) {
console.log(`我叫${this.name},喜欢${x}和${y}`);
}
};
const obj2 = {
name: '阿花'
};
obj1.getName.apply(obj2,['吃饭','睡觉'])
手写apply
apply不同的就是第二个参数变成了数组
Function.prototype.myapply = function(content) {
if (typeof context === "undefined" || context === null) {
context = window
}
let args = [...arguments].slice(1)
content.fn = this
const result = content.fn(arguments[1][0],arguments[1][1])
delete content.fn
return result
} obj1.getName.myapply(obj2,['吃饭','睡觉'])
bind()
用法和call类似,不过bind()会创建一个新的函数,需要再次进行调用
function a(x, y, z){
return this.name + '喜欢' + x + '、' + y + '和' + z;
}
var b = {name : '阿花'};
a.getName.bind(b,'读书','看报')('滑板')
手写bind()
- 函数调用
- 改变this
- 返回一个绑定this的函数
- 接收多个参数
- 支持柯里化形式传参 fn(1)(2)(3)
代码实现
Function.prototype.mybind = function(context){
if (typeof context === "undefined" || context === null) {
context = window
}
var args = [...arguments].slice(1);
var self = this;
return function(){
var innerArgs = [...arguments];
var finalArgs = args.concat(innerArgs);
return self.apply(context, finalArgs);
}
}
function a(x, y, z){
return this.name + '喜欢' + x + '、' + y + '和' + z;
}
var b = {name : '阿花'};
a.mybind(b, '读书', '看报')('滑板');
|