我在nodejs中运行以下代码
this.x = 'global x';
class Point {
constructor(x) {
this.x = x;
}
toString() {
return this.x;
}
}
var obj = new Point(1);
obj.toString();// 1 as expected
var a = obj.toString;// Here I can do something like var a = obj.toString.bind(obj); to get rid of the situation. But I am curious to know how can we write `var self = this`;
a();// TypeError: Cannot read property 'x' of undefined
a();
抛出错误
我们如何像var self = this;
那样做es5
以防止出现这种情况?
答案 0 :(得分:22)
我们如何像过去在ES5中那样做
var self = this;
?
你可以像在ES5中那样完全执行 - 毕竟ES6完全向后兼容:
class Point {
constructor(x) {
this.x = x;
var self = this;
this.toString = function() {
return self.x;
};
}
}
但是,这并不是惯用的ES6(不是在谈论const
而是var
)。您宁愿使用具有词法范围this
的箭头函数,以便您可以完全避免使用此self
变量:
class Point {
constructor(x) {
this.x = x;
this.toString = () => {
return this.x;
};
}
}
(甚至可以缩短为this.toString = () => this.x;
)
答案 1 :(得分:14)
如果您不想像Bergi建议的那样在构造函数中创建所有类方法(这对我来说似乎很难看),那么您可以enable ES7 features使用箭头语法定义您的方法:
class Point
{
constructor(x)
{
this.x = x;
}
toString = () =>
{
return this.x;
}
}
这与说法相同:
constructor(x)
{
this.toString = this.toString.bind(this);
}
但它仍然不允许您在同一个函数中访问动态 this 和词汇 this ( self )。所以这是不一个完整的答案。
我希望有人可以编辑这个答案,以展示如何在类方法中访问两种类型的 this ,而无需在类构造函数中定义每个方法。