不能用ES6 / babel-node子类化

时间:2023-01-09 17:09:57

I have the following files: gist

我有以下文件:要点

The index.js attempts instantiate a base "Auth" class but in it's constructor the auth class acts as an object factory and passes back a subclass of Auth instead.

index.js尝试实例化一个基类“Auth”类,但是在它的构造函数中,auth类充当对象工厂并且传回一个Auth的子类。

'use strict';
import Auth from './Auth';

let o = new Auth({type:'Oauth1'});
console.log(o);
o.getToken();

The Auth.js class definition is as follows:

Auth.js类定义如下:

'use strict';
import Oauth1 from './Oauth1';

export default class Auth {
    constructor(config) {
        if (this instanceof Auth) {
            return new Oauth1(config);
        } else {
            this.config = config;
        }
    }

    getToken() {
        console.log('Error: the getToken module must be implemented in the subclass');
    }
}

And the Oauth1.js class definition is:

而Oauth1.js类的定义是:

'use strict';
import Auth from './Auth';

export default class Oauth1 extends Auth {
    getToken() {
        console.log('Auth: ', Auth);
    }
}

When running with babel-node index.js I get the following error:

当使用babel-node index.js运行时,我收到以下错误:

TypeError: Super expression must either be null or a function, not undefined

TypeError:超级表达式必须为null或函数,而不是未定义

at _inherits (/repos/mine/test-app/Oauth1.js:1:14)
at /repos/mine/test-app/Oauth1.js:4:28
at Object.<anonymous> (/repos/mine/test-app/Oauth1.js:4:28)
at Module._compile (module.js:434:26)
at normalLoader (/usr/local/lib/node_modules/babel/node_modules/babel-core/lib/api/register/node.js:199:5)
at Object.require.extensions.(anonymous function) [as .js] (/usr/local/lib/node_modules/babel/node_modules/babel-core/lib/api/register/node.js:216:7)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Module.require (module.js:365:17)
at require (module.js:384:17)

If I remove the extends expression from the Oauth1 class it executes but then I am not getting the inheritance I want.

如果我从它执行的Oauth1类中删除extends表达式,但是我没有得到我想要的继承。

1 个解决方案

#1


3  

Your issue has nothing to do with babel. The real problem is that you have circular dependencies in your code.

你的问题与babel无关。真正的问题是你的代码中有循环依赖。

To resolve this issue you should remove Oauth1 dependency from its parent Auth class:

要解决此问题,您应该从其父Auth类中删除Oauth1依赖项:

'use strict';
export default class Auth {
    constructor(config) {
        this.config = config;
    }

    getToken() {
        console.log('Error: the getToken module must be implemented in the subclass');
    }
}
'use strict';
import Auth from './Auth';

export default class Oauth1 extends Auth {
    getToken() {
        console.log('Auth: ', Auth);
    }
}

If you don't want to remove this instanceof Auth check from your base class, you could require your Oauth1 subclass in run-time instead of importing it during module initialization:

如果您不想从基类中删除此Auth检查实例,则可能需要在运行时使用Oauth1子类,而不是在模块初始化期间导入它:

constructor(config) {
    if (this instanceof Auth) {
        let Oauth1 = require('./Oauth1');
        return new Oauth1(config);
    }
    this.config = config;
}

#1


3  

Your issue has nothing to do with babel. The real problem is that you have circular dependencies in your code.

你的问题与babel无关。真正的问题是你的代码中有循环依赖。

To resolve this issue you should remove Oauth1 dependency from its parent Auth class:

要解决此问题,您应该从其父Auth类中删除Oauth1依赖项:

'use strict';
export default class Auth {
    constructor(config) {
        this.config = config;
    }

    getToken() {
        console.log('Error: the getToken module must be implemented in the subclass');
    }
}
'use strict';
import Auth from './Auth';

export default class Oauth1 extends Auth {
    getToken() {
        console.log('Auth: ', Auth);
    }
}

If you don't want to remove this instanceof Auth check from your base class, you could require your Oauth1 subclass in run-time instead of importing it during module initialization:

如果您不想从基类中删除此Auth检查实例,则可能需要在运行时使用Oauth1子类,而不是在模块初始化期间导入它:

constructor(config) {
    if (this instanceof Auth) {
        let Oauth1 = require('./Oauth1');
        return new Oauth1(config);
    }
    this.config = config;
}