【问题标题】:Classes - 'this' vs 'self'类 - 'this' vs 'self'
【发布时间】:2016-11-28 18:26:23
【问题描述】:

我正在使用新的ES6 Classes,我很难理解为什么我可以引用this 变量是其中一种方法。

//类

class Form{ 
    constructor(){
        var self = this;
    }   

    assemble(){
        log(self);
    }
}

//调用

var form = new Form();
form.assemble();

//返回

window object (not the reference to the class object)

【问题讨论】:

标签: javascript es6-class


【解决方案1】:

this 不是变量。它更像是函数的隐藏参数。

您无法在示例中访问 self,因为它是构造函数中的局部变量,因此不适用于您的 assemble 方法。

您的示例根本不需要self,只需使用this

class Form {
    assemble(){
        log(this);             // ***
    }
}
var form = new Form();
form.assemble();

如果您将form.assemble 传递给不能保证用正确的this 调用它的东西,您可以将assemble 定义为实例函数成员,方法是在构造函数中定义它;然后它将关闭self。但是在 ES2015 及更高版本中,您不需要 self ;只需使用箭头函数,它会关闭this

class Form {
    constructor(){
        var self = this;
        this.assemble = () => {
            log(this);
        };
    }   
}
var form = new Form();
form.assemble();          // Works
var f = form.assemble;
f();                      // Also works

但您可能不需要这样做。

【讨论】:

  • 谢谢!如此简单,只是不习惯它停留在我的旧方式中,哈哈。
  • 在构造函数中定义函数是否比将其定义为普通类函数并在构造函数中绑定它有任何优势,即this.foo = this.foo.bind(this)?我个人认为后者更具可读性。
  • @Timo:如果你像我上面那样使用箭头函数,不,无论哪种方式都没有技术优势,只是风格不同。我的意思是,好吧,从技术上讲,bind 解决方案有一个额外的功能(只有一个,不是每个实例一个),但谁在乎呢?如果您在构造函数中使用function 函数而不是箭头(但您为什么要这样做?:-)),那么bind 解决方案会更好,因为在这种情况下您可以使用super 但不能从在构造函数中创建了一个function 函数。
  • @T.J.Crowder 感谢您的澄清!
猜你喜欢
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
  • 2018-12-22
  • 1970-01-01
  • 2016-06-10
  • 1970-01-01
  • 2023-02-22
相关资源
最近更新 更多