在JavaScript中,是否可以使用与类函数同名的类getter?

时间:2019-02-25 23:23:23

标签: javascript

我知道这可能是一种反模式,但是我很好奇某些JavaScript库如何能够将JavaScript函数与可选的括号链接起来(例如chalk

一个例子就是...

let test = (new SomeClass()).initiate.parse(1).end;
let test = (new SomeClass()).initiate(1).parse.end;

有没有办法做到这一点?我想过也许要用吸气剂做到这一点,但是SomeClass的get initiate()被类函数initiate()覆盖了。

2 个答案:

答案 0 :(得分:3)

否,不可能有一个具有相同名称的getter和方法。

尽管可以实现您想要的。一种方法是在您的吸气剂中使用Proxy来制作代理,以便在访问其他属性时,改为访问原始对象的该属性。

class SomeClass {

  get initiate ( ) {
    console.log( `Accessed initiate` );
    return new Proxy( x => {
      console.log( `Called initiate with arg ${x}` );
      this.stored = x;
      return this;
    }, { get: (_,prop) => this[prop] } );
  }
  
  get parse ( ) {
    console.log( `Accessed parse` );
    return new Proxy( x => {
      console.log( `Called parse with arg ${x}` );
      this.stored = x;
      return this;
    }, { get: (_,prop) => this[prop] } );
  }
  
  get end ( ) {
    return this.stored;
  }
  
}

console.log( (new SomeClass).initiate(2).parse.end );
console.log( (new SomeClass).initiate.parse(3).end );
console.log( (new SomeClass).initiate(5).parse(7).end );

答案 1 :(得分:1)

我强烈建议您看看chai或其他断言库如何做到这一点。对于所需的代码,您可以查看here

他们所做的是定义一个Assertion类,并分别定义方法和属性。从they use getters as you mentioned开始,您可以尝试使用属性,但它们也将方法分开(请参见addMethod

您可以查看的另一个问题是How does the expect().to.be.true work in Chai?,其中被接受的答案包含一个代码示例,说明如何获得一些非常基础的工作。

我将认真考虑使方法和属性具有相同的名称。这会使许多将您的班级用作消费者的人感到困惑。