Function.call.bind(Object.prototype.toString)

var toStr1 = Function.prototype.call.bind(Object.prototype.toString);

我们调用看看,传入不同的类型试试,效果如下:

console.log(toStr1({}));      // "[object Object]"
console.log(toStr1([]));      // "[object Array]"
console.log(toStr1(123));     // "[object Number]"
console.log(toStr1("abc"));   // "[object String]"
console.log(toStr1("abc"));   // "[object String]"
console.log(toStr1(new Date));// "[object Date]"

通常类型检测,我们可能更多地看到如下代码实现:

var toStr2 = obj => Object.prototype.toString.call(obj);

console.log(toStr2({}));      // "[object Object]"
console.log(toStr2([]));      // "[object Array]"
console.log(toStr2(123));     // "[object Number]"
console.log(toStr2("abc"));   // "[object String]"
console.log(toStr2("abc"));   // "[object String]"
console.log(toStr2(new Date));// "[object Date]"

为了防止原型污染,比如我们在业务代码中覆写了Object.prototype.toString方法,
第二种写法将得不到正确的结果,而第一种写法仍然可以。我们用代码来来试试:

var toStr1 = Function.prototype.call.bind(Object.prototype.toString);

var toStr2 = obj => Object.prototype.toString.call(obj);

Object.prototype.toString = function(){
  return'toString方法被覆盖!';
}
// 接着我们再调用上述方法

// toStr1调用结果如下:
console.log(toStr1({}));      // "[object Object]"
console.log(toStr1([]));      // "[object Array]"
console.log(toStr1(123));     // "[object Number]"
console.log(toStr1("abc"));   // "[object String]"
console.log(toStr1("abc"));   // "[object String]"
console.log(toStr1(new Date));// "[object Date]"

// toStr2调用结果如下:
console.log(toStr2({}));      // "toString方法被覆盖!"
console.log(toStr2([]));      // "toString方法被覆盖!"
console.log(toStr2(123));     // "toString方法被覆盖!"
console.log(toStr2("abc"));   // "toString方法被覆盖!"
console.log(toStr2("abc"));   // "toString方法被覆盖!"
console.log(toStr2(new Date));// "toString方法被覆盖!"
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
.call.bind()是一个常见的JavaScript技巧,用于将一个函数绑定到一个特定的this值。它是函数绑定技巧中的一部分,可用于将一个函数绑定到某个对象,以便在执行该函数时使用该对象作为this值。 .call.bind()实际上是两个函数的组合。首先,.call方法是一个JavaScript内置函数,它是用于将函数调用的this值绑定到特定值或对象。接下来,.bind()方法是一个函数绑定函数,它返回一个新函数,该函数将调用原始函数,并在执行时将指定的this值作为第一个参数传递。 .call.bind()方法的基本形式如下: ``` var bound = Function.prototype.call.bind(someFunction); bound(thisArg, arg1, arg2, ...); ``` 其中: - Function.prototype.call是一个JavaScript内置函数,可以调用其他函数,并传递一个特定的this值。 - bind()是一个函数绑定函数,它返回一个新函数,该函数将原始函数绑定到给定的this值。 - someFunction是要绑定的原始函数。 - bound是一个新函数,它将在执行时将其第一个参数作为this值传递给someFunction。 该技术可以解决JavaScript中函数调用中this值的问题。例如,当在对象方法中调用函数时,this值不一定是该对象,而是由该方法的调用者决定。使用.call.bind(),我们可以绑定实际的this值,以便在方法中使用它。 例如,如果有一个对象person,其中包含方法sayHi,可以使用.call.bind()将该方法绑定到person对象: ``` var person = { name: 'John', sayHi: function() { console.log('Hi, my name is ' + this.name); } }; var bound = Function.prototype.call.bind(person.sayHi); bound(); //输出:Hi, my name is John ``` 在上面的代码中,我们将person.sayHi方法绑定到person对象,然后调用绑定的方法,使用person对象作为this值。结果,输出'Hi, my name is John',因为this值被绑定到person对象。 总之,.call.bind()技巧是一种常用的JavaScript函数绑定技巧,用于将函数绑定到特定的this值,以便在函数调用时使用该this值。它可以解决JavaScript中一些常见的this值问题,使代码更加清晰易懂。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值