如何在bind()中处理'new'运算符?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在bind()中处理'new'运算符?相关的知识,希望对你有一定的参考价值。
我正在学习javascript中的.call()
,.apply()
,.bind()
方法。当涉及到bind()
方法时,我碰到了一行:
[请注意,如果使用“ new”运算符构造绑定函数,则将忽略第一个参数的值。
我听不懂。 使用new
运算符构造绑定函数意味着什么?
所以让我们分解一下。首先,“ new”关键字有什么作用?除其他事项外,它调用其前面的函数,但将“ this”的值设置为新创建的空对象。这对于使用构造函数创建对象的新实例很有用。 (建议您阅读更多内容)
另一方面,.bind方法将创建调用该函数的副本,但是将“ this”的值设置为您传递给它的第一个参数。
因此,这只是意味着,如果您使用new尝试调用与“ this”关键字的值绑定的函数,则“ new”关键字将覆盖您的.bind并将“ this”设置为空对象。
正如我所说,“新”用于通过“构造”该实例的函数来制作新实例。因此,使用“ new”构造绑定函数意味着将绑定函数用作构造函数。
有四种方法可以在javascript中调用函数:
普通呼叫,例如
myFunc()
。在这种情况下,函数中的this
将成为草率模式下的全局对象,而严格模式下的undefined
将成为全局对象方法调用,例如
someObject.myFunc()
-this
将设置为someObject
myFunc.call(arg)
-在这种情况下,this
将设置为arg
new myFunc
-在这里,this
将是一个新创建的对象,其原型设置为myFunc.prototype
绑定函数的行为有所不同:对于情况1-3,其this
将是“锁定的”,已作为bind
参数提供。但是,对于new
情况,锁定的this
将被忽略,并且this
仍将是一个新对象,其原型链接到original函数。
插图:
function myFunc() {
console.log('this=', this.name,
'constructor=', this.constructor.name,
this.constructor === myFunc)
}
myFunc.prototype.name = 'PROTOTYPE'
let myObj = {name: 'myObj'}
/* 1) */ myFunc()
/* 2) */ myObj.f = myFunc; myObj.f()
/* 3) */ myFunc.call({name: 'CALL'})
/* 4) */ new myFunc()
console.log('--------')
let bound = myFunc.bind({name: 'LOCKED'})
/* 1) */ bound()
/* 2) */ myObj.f = bound; myObj.f()
/* 3) */ bound.call({name: 'CALL'})
/* 4) */ new bound()
以上是关于如何在bind()中处理'new'运算符?的主要内容,如果未能解决你的问题,请参考以下文章
解决webpack4版本在打包时候出现Cannot read property 'bindings' of null 或 Cannot find module '@babel/
php 抛出一个异常throw new Exception(...),报错Class 'ss\Exception' not found为啥?