我知道这可能是一种反模式,但是我很好奇某些JavaScript库如何能够将JavaScript函数与可选的括号链接起来(例如chalk)
一个例子就是...
let test = (new SomeClass()).initiate.parse(1).end;
let test = (new SomeClass()).initiate(1).parse.end;
有没有办法做到这一点?我想过也许要用吸气剂做到这一点,但是SomeClass的get initiate()
被类函数initiate()
覆盖了。
答案 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?,其中被接受的答案包含一个代码示例,说明如何获得一些非常基础的工作。
我将认真考虑使方法和属性具有相同的名称。这会使许多将您的班级用作消费者的人感到困惑。