【问题标题】:How to declare a function with the same name as a property in class name in javascript?如何在javascript中声明与类名中的属性同名的函数?
【发布时间】:2020-04-13 03:44:59
【问题描述】:

我在使用 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 团队正在做的事情?他们是如何发挥这种魔力的?

【问题讨论】:

  • 函数是一个对象,所以你可以给它们分配属性和方法。
  • 啊。那讲得通。但是在类内部函数的上下文中,这可能吗?
  • 是的。就像下面的 hackape 所做的那样。

标签: javascript firebase class oop getter-setter


【解决方案1】:

你必须注意你的类的等效于 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;
    }

}

【讨论】:

    【解决方案2】:

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

    function auth () {
     return ‘banana’
    }
    
    auth.Auth = ‘wookie’;
    
    console.log(auth()); // banana
    console.log(auth.Auth); // wookie 
    

    【讨论】:

    • 你可以为类中的函数执行此操作吗?我尝试将它设置在一个类中,它会引发同样的错误。
    猜你喜欢
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 2013-01-02
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    • 2019-12-20
    相关资源
    最近更新 更多