You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法访问Firebase中JavaScript扩展类的公共方法

问题:扩展类的公共方法无法被外部调用,提示“不是函数”

我在访问扩展类的公共方法时遇到了如下错误:
新生实例中的公共方法不是函数

我的AuthManager类代码如下,看起来没问题,但外部调用connect()时提示不是函数:

import { getAuth, signInWithEmailAndPassword, setPersistence, browserLocalPersistence, getIdToken, updateProfile, signOut } from 'firebase/auth';

export default class AuthManager extends getAuth {
  constructor() {
    super();
  }
  async connect() {
   // 业务逻辑
  }
}

外部实例化并调用的代码:

import AuthManager from './auth/firebase-auth';

export default class FirebaseManager {
  #config = void 0;
  constructor(config) {
    this.isValidConfig(config)
      ? (this.#_initConfig = config)
      : () => {throw new TypeError('Missing or invalid configuration for FirebaseManager')}
  }
  set #_initConfig(conf) {
    this.#config = conf;
    this.#initiate();
  }
  isValidConfig(config) { // 验证逻辑 }
  async #initiate() {
    this.authenticationManager = new AuthManager(); 
    await this.authenticationManager.connect() // 此处提示connect()不是函数
    // 其他逻辑
  }
}

我尝试过两种可行的方式,但都不是我想要的:

  • 将connect赋值给成员变量可以正常调用,但不想这么做
  • 把connect定义为私有方法#connect,类内部直接调用正常,但无法外部访问

解决方案

问题核心:你错误地继承了getAuth工厂函数,而非Firebase Auth对应的实例或可继承类。

getAuth是Firebase提供的工厂函数,作用是返回一个Auth实例,它本身不是可被继承的类。当你用class AuthManager extends getAuth时,本质是在继承一个函数,这不符合JavaScript类继承逻辑,最终导致自定义的connect方法无法正确挂载到实例上。

推荐两种修正方式:

方式1:组合而非继承(优先推荐)

不要继承getAuth,而是在AuthManager内部持有Auth实例,这更符合Firebase的使用规范,也更灵活:

import { getAuth, signInWithEmailAndPassword, setPersistence, browserLocalPersistence, getIdToken, updateProfile, signOut } from 'firebase/auth';

export default class AuthManager {
  #authInstance;
  constructor() {
    this.#authInstance = getAuth(); // 初始化Auth实例
  }
  async connect() {
    // 可通过this.#authInstance调用Firebase Auth的API
    // 业务逻辑
  }
}

方式2:继承Auth类(不推荐,存在版本兼容风险)

如果你一定要用继承,可以获取getAuth返回实例的构造函数,但Firebase官方不保证内部类结构的稳定性,版本升级可能导致代码失效:

import { getAuth } from 'firebase/auth';

// 获取Auth实例的构造函数
const AuthClass = getAuth().constructor;

export default class AuthManager extends AuthClass {
  constructor() {
    super();
  }
  async connect() {
    // 业务逻辑
  }
}

内容的提问来源于stack exchange,提问作者greasieball

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 02:15:38