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

时间:2015-09-15 10:10:39

标签: 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

a();抛出错误 我们如何像var self = this;那样做es5以防止出现这种情况?

2 个答案:

答案 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 ,而无需在类构造函数中定义每个方法。