箭头函数和此函数在构造函数中

时间:2018-11-05 00:39:47

标签: javascript constructor this arrow-functions

我已经阅读了有关this关键字的这一段:https://bonsaiden.github.io/JavaScript-Garden/#function.this

在第一种情况下,this指向global对象,这似乎是很正常的,因为当我们拥有箭头功能时,它会自动将this与外部作用域绑定。

var obj = {
      foo : () => console.log(this)
    }
console.log(obj);
obj.foo()

但是,我无法解释以下行为:

function bar(){
  this.foo = () => console.log(this)
} 

var obj = new bar()
console.log(obj);
obj.foo()

现在,this是指obj而不是global。这是为什么 ?在我看来,将new关键字与构造函数一起使用应该返回一个对象obj,该对象与第一个示例中的对象完全相同。因此,箭头函数应该有一个this,它指向global,而不是obj。请问第二种情况是怎么回事?

2 个答案:

答案 0 :(得分:4)

功能-> No separate this

  

在箭头函数之前,每个新函数都定义了自己的this值(对于构造函数而言,是 新对象 ,在{{3}中未定义) }函数调用,如果该函数被称为“对象方法”等,则为基础对象)。事实证明,采用面向对象的编程风格并不理想

strict mode

  

使用指定的参数调用构造函数...,并将this绑定到 新创建的对象

bar()构造函数将this定义为自身。

答案 1 :(得分:0)

尽管我本人对对象(需要进行处理)远非如此,但我认为当您const test = new Test()进行操作时,您会初始化一个新对象。这样,this的scope(?)仅引用了新创建的对象,因此为什么要这样做this.foo,以后又要使用obj.foo来引用该foo属性。另一方面,当您只执行const obj = { .... }时,实际上并没有初始化新对象,因此this会直接转到全局对象-窗口。因此,const test = new Test创建一个 new 对象,而仅使用const obj = {}并不是 一个新对象,并且this默认转到窗口对象。