无法访问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
相关产品推荐
相关产品推荐

