Подтвердить что ты не робот

Как сделать `var self = this` внутри класса es6?

Я запускаю код ниже в 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, чтобы предотвратить такую ​​ситуацию?

4b9b3361

Ответ 1

Как мы можем сделать, как var self = this;, как мы это делали в ES5?

Вы можете сделать это точно так же, как в 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;)

Ответ 2

Если вы не хотите создавать все свои методы класса внутри конструктора, как предлагает Берги (что кажется мне уродливым), вы можете включить функции ES7 и определить ваш метод с использованием синтаксиса стрелок:

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

    toString = () =>  
    {
        return this.x;
    }
} 

Это имеет тот же эффект, что и:

constructor(x)
{
    this.toString = this.toString.bind(this);
}

Но он по-прежнему не позволяет вам получить доступ к динамическому этому и лексическому (self) в той же функции. Таким образом, это не полный ответ.

Я надеюсь, что кто-то может отредактировать этот ответ, чтобы показать, как мы можем получить доступ к обоим типам этого метода класса, не определяя каждый метод в конструкторе класса.