es6类中'this'的值是什么意思?

时间:2017-01-04 02:53:34

标签: javascript oop ecmascript-6

我目前正在学习JavaScript中的原型继承。从我到目前为止所读到的,在es5中,this关键字指的是从中调用函数的上下文。

但是,对于ES6类,我已经读过“this”值在词法上绑定到类实例。谁可以给我解释一下这个?在旁注。我还读到我不应该使用类语法,而是使用OLOO模式。编辑:我打算在这里问一个问题。 Eric Elliot似乎坚持不以这种方式接近oop和继承,而是使用他的OLOO模式。他是对的吗?或者他的观点充满了毛病?

1 个答案:

答案 0 :(得分:4)

在ES6中添加类不会改变this绑定方式的规则。事实上,ES6类只是常规原型继承的syntactic sugar

类只需在引擎盖下添加一些安全检查,并允许更简单的语法。

以下两个示例基本相同:

class A {
  constructor() {
    this.something = 5;
  }
}

console.log(
  new A().something // 5
)

function A() {
  if (!this instanceof A) {
    throw new TypeError("Class constructor A cannot be invoked without 'new'");
  }
  this.something = 5;
}

console.log(
  new A().something // 5
)

this未引用从中调用函数的上下文。在大多数情况下,this的值取决于函数的调用方式。

例如,上面的检查,即this instanceof A基本上确保在没有A运算符的情况下调用new会引发错误。这项检查被纳入课程。

class A {
  constructor() {
    this.something = 5;
  }
}

A() // Error!

通过将调用限制为使用new运算符,我们确保this根据使用new的{​​{3}}绑定到类中。

  

当一个函数被用作构造函数(使用new关键字)时,它将被绑定到正在构造的新对象。

这意味着,无论是在调用函数作为构造函数还是实例化类(即new A())时,JavaScript都会执行以下操作(关于我们相同的A示例):

function A() {
  var newObjectThatWillBeThis = {};
  newObjectThatWillBeThis.something = 5;
  return newObjectThatWillBeThis;
}

就使用OLOO模式或常规原型模式而言,没有一种正确的方法。这是OLOO的发明者rules,比较了这两种方法。