如何在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中调用函数:

  1. 普通呼叫,例如myFunc()。在这种情况下,函数中的this将成为草率模式下的全局对象,而严格模式下的undefined将成为全局对象

  2. 方法调用,例如someObject.myFunc()-this将设置为someObject

  3. myFunc.call(arg)-在这种情况下,this将设置为arg

  4. 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表单中含上传图片的问题,哪里不对

php 抛出一个异常throw new Exception(...),报错Class 'ss\Exception' not found为啥?

ES10(2019)可选的Catch Binding

如何在鱼壳中将转义插入模式重新映射为'jk'?

GYM - 101147 J.Whistle's New Car