我目前正在学习JavaScript中的原型继承。从我到目前为止所读到的,在es5中,this
关键字指的是从中调用函数的上下文。
但是,对于ES6类,我已经读过“this”值在词法上绑定到类实例。谁可以给我解释一下这个?在旁注。我还读到我不应该使用类语法,而是使用OLOO模式。编辑:我打算在这里问一个问题。 Eric Elliot似乎坚持不以这种方式接近oop和继承,而是使用他的OLOO模式。他是对的吗?或者他的观点充满了毛病?
答案 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,比较了这两种方法。