【问题标题】:Omit using "this." all the time省略使用“这个”。每时每刻
【发布时间】:2021-04-22 14:21:37
【问题描述】:

我有一些类似的代码

    get ab(){ 
        if(this.a == this.b) this.c = this.a.add(this.b);
        if(this.d == this.b) this.d = this.a.add(this.b, this.bIdx).normalize();
        return this._ab || 
               (this._ab = new Edge(this.allPoints, this.aIdx, this.bIdx)); 
    }

这很烦人!而且还会影响可读性。这段代码本来可以更短......我如何在 C++ 或 Haxe 风格中使用 TS,我们不必提及“这个”。任何?编译器不是很容易猜测“如果有一个变量名 - 检查这个名字的成员是否存在”?

注意:我的问题与这个无关:Can I avoid using the word "this" inside Typescript when calling a function that came in through a constructor? - 在那里,开发人员询问是否可以不使用传递给构造函数的瞬态对象属性。在我的问题中,我问是否可以在访问属性时省略“this”关键字

【问题讨论】:

标签: typescript syntactic-sugar


【解决方案1】:

TypeScript(和 JavaScript)没有隐含 this

对于您只打算读取(而不是写入)的值,您可以解构为局部变量或常量:

get ab(){ 
    const {a, b, d, aIdx, bIdx, _ab} = this;
    if(a == b) this.c = a.add(b);
    if(d == b) this.d = a.add(b, bIdx).normalize();
    return _ab || 
           (_ab = new Edge(allPoints, aIdx, bIdx)); 
}

但您可能更喜欢 Crockford 风格的闭包编程。代替带有ab 等的对象,您可以在函数中使用局部变量来返回带有方法的对象:

function createExample() {
    let a, b, c, d, aIdx, bIdx, _ab;

    // ...

    return {
        ab() {
            if(a == b) c = a.add(b);
            if(d == b) d = a.add(b, bIdx).normalize();
            return _ab || 
                   (_ab = new Edge(allPoints, aIdx, bIdx)); 
        }
    };
}

然后,由于您在返回函数上的方法在创建它的调用中关闭了本地,因此您只需直接使用ab 等。

不过,最好尽量减少两种样式的混合。请注意,这种风格目前在 JavaScript 和 TypeScript 圈子中不像使用带有属性的对象那样流行,这可能是让其他人处理代码时的一个因素。 (虽然这只是一个培训问题。)

【讨论】:

  • 或多或少,它会做:) 但是它会复制,所以我不能做“property = value”,我必须“this.property = value”,对吧?
  • @shal - 对,这就是我上面有this.c =this.d = 的原因,也是使用const 的部分原因(这样如果你忘记了,你会得到一个明显的错误而不是只是......没有看到变化发生)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-21
  • 2020-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多