如何在 javascript 中声明与 class 名称中的 属性 同名的函数?

How to declare a function with the same name as a property in class name in javascript?

我在使用 Google Firebase 身份验证和 Firebase Firestore 时遇到过这个问题。可以访问同名的变量和它们类的函数,例如:

//To authenticate:
firebase.auth().signInWithEmailAndPassword()

//Or to access a value
firebase.auth.Auth.Persistence.SESSION

注意他们如何同时使用 firebase.authfirebase.auth()。当我尝试查看是否可以执行时,它会抛出一个错误:

class foo {

    public bar;

    constructor() {
        this.bar = 'Bar!'; //Expecting 'Bar!' when run foo.bar()
    }

    //However, it throws an error here, as bar was already defined
    bar() {
        return 'Function bar() was called';
    }

}

我什至尝试查看 setter 和 getter,因为它们也可以识别调用的是 foo.bar 还是 foo.bar(),但是 setter不接受返回值。

我如何做 Firebase 团队正在做的事情?他们是如何变出这种魔法的?

可以为函数分配额外的属性。

function auth () {
 return ‘banana’
}

auth.Auth = ‘wookie’;

console.log(auth()); // banana
console.log(auth.Auth); // wookie 

伙计,你必须注意你的 class 的 firebase 样式的等效项应该如下所示,你只是做错了。

class foo {

    constructor() {
        this.bar.bar = 'Bar!';
        // instead of this.bar = 'Bar!';
    }

    bar() {
        return 'Function bar() was called';
    }

}

不过。如果您必须将“.bar”设置为正常值,然后将 .bar 作为函数返回,您可以使用 getter/setter。只是对我来说意义不大。

class foo {

    constructor() {
        this.bar = 'Bar!';
    }

    barFunc() {
      'Function bar() was called';
    }

    get bar() {
      return this.barFunc;
    }

    set bar(value) {
      this.barValue = value;
    }

}