如何在es6类中执行`var self = this`?

int*_*hab 32 javascript ecmascript-6

我在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
Run Code Online (Sandbox Code Playgroud)

a();抛出错误.
我们怎样才能像var self = this;过去那样做es5以防止出现这种情况?

Ber*_*rgi 24

我们怎么能像var self = this;以前一样在ES5中做到?

你可以像在ES5中那样完成 - 毕竟ES6完全向后兼容:

class Point {
    constructor(x) {
        this.x = x;
        var self = this;
        this.toString = function() {
            return self.x;
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,这真的不是惯用的ES6(而不是谈论const而不是var).您宁愿使用具有词法范围的箭头函数this,以便您可以self完全避免使用此变量:

class Point {
    constructor(x) {
        this.x = x;
        this.toString = () => {
            return this.x;
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

(甚至可以缩短到this.toString = () => this.x;)


Ric*_*ard 14

如果您不想像Bergi建议的那样在构造函数中创建所有类方法(这对我来说似乎很难看),那么您可以启用ES7功能并使用箭头语法定义您的方法:

class Point 
{
    constructor(x) 
    {
        this.x = x;
    }

    toString = () =>  
    {
        return this.x;
    }
} 
Run Code Online (Sandbox Code Playgroud)

这与说:

constructor(x)
{
    this.toString = this.toString.bind(this);
}
Run Code Online (Sandbox Code Playgroud)

但是它仍然不允许你在同一个函数中访问动态this和词汇this(self).所以这不是一个完整的答案.

我希望有人可以编辑这个答案来展示我们如何可以访问这两种类型的这个类中的方法,无需在类的构造函数定义的所有方法.

  • 好吧,这仍然会在构造函数中创建所有方法(并且同样丑陋),只是它使用了实验语法. (3认同)