Как сделать `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
, чтобы предотвратить такую ситуацию?
Ответы
Ответ 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) в той же функции. Таким образом, это не полный ответ.
Я надеюсь, что кто-то может отредактировать этот ответ, чтобы показать, как мы можем получить доступ к обоим типам этого метода класса, не определяя каждый метод в конструкторе класса.