var obj = {
name: '小额',
getName(val, val2, val3) {
return '名字:' + this.name + ' 年龄:' + val + ' 爱好:' + val2 + ' 愿望:' + (val3 ? val3 : "暂无")
}
}
var obj2 = {
name: '夏普'
}
//call
Function.prototype.mycall = function (obj, ...args) {
obj = (obj !== undefined && obj !== null) ? Object(obj) : window;
obj._fun = this;
let res = obj._fun(...args);
delete obj._fun;
return res;
}
console.log(obj.getName.mycall(obj2, 12, '打球'))
//apply和call传参方式不同
Function.prototype.myapply = function (obj, args) {
obj = (obj !== undefined && obj !== null) ? Object(obj) : window;
args = args ? args : []
obj._fun = this;
if (!(args instanceof Array)) {
throw new TypeError("CreateListFromArrayLike called on non-object");
}
let res = obj._fun(...args);
delete obj._fun;
return res;
}
console.log(obj.getName.myapply(obj2, [12, '打球']))
//bind和call传参一样,但是不会立即执行,而是返回一个函数
Function.prototype.mybind = function (obj, ...args) {
obj = (obj !== undefined && obj !== null) ? Object(obj) : window;
obj._fun = this;
return function (...rest) {
let res = obj._fun(...args, ...rest);
delete obj._fun;
return res;
}
}
let fn = obj.getName.mybind(obj2, 12, '打球');
console.log(fn('开心'))
//打印
//名字:夏普 年龄:12 爱好:打球 愿望:暂无
//名字:夏普 年龄:12 爱好:打球 愿望:暂无
//名字:夏普 年龄:12 爱好:打球 愿望:开心
JS实现简单的call,apply,bind
最新推荐文章于 2024-07-24 11:09:48 发布