Node.js Can';具有ES6/babel节点的t子类

Node.js Can';具有ES6/babel节点的t子类,node.js,ecmascript-6,babeljs,Node.js,Ecmascript 6,Babeljs,我有以下文件: index.js试图实例化一个基本的“Auth”类,但在它的构造函数中,Auth类充当对象工厂,并传回Auth的子类 'use strict'; import Auth from './Auth'; let o = new Auth({type:'Oauth1'}); console.log(o); o.getToken(); Auth.js类定义如下: 'use strict'; import Oauth1 from './Oauth1'; export default

我有以下文件:

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

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

let o = new Auth({type:'Oauth1'});
console.log(o);
o.getToken();
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');
    }
}
Oauth1.js类定义是:

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

export default class Oauth1 extends Auth {
    getToken() {
        console.log('Auth: ', Auth);
    }
}
使用
babel node index.js
运行时,出现以下错误:

类型错误:超级表达式必须为null或函数,而不是未定义的

at_继承(/repos/mine/test-app/Oauth1.js:1:14) at/repos/mine/test-app/Oauth1.js:4:28 反对。(/repos/mine/test-app/Oauth1.js:4:28) 在模块处编译(Module.js:434:26) 在normalLoader(/usr/local/lib/node_modules/babel/node_modules/babel core/lib/api/register/node.js:199:5) at Object.require.extensions.(匿名函数)[as.js](/usr/local/lib/node_modules/babel/node_modules/babel core/lib/api/register/node.js:216:7) 在Module.load(Module.js:355:32) 在Function.Module.\u加载(Module.js:310:12) at Module.require(Module.js:365:17) 根据需要(module.js:384:17)
如果我从它执行的Oauth1类中删除
extensed
表达式,但是我没有得到我想要的继承。

您的问题与
babel
无关。真正的问题是您的代码中有

要解决此问题,您应该从其父级
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');
    }
}
如果您不想从基类中删除
这个Auth
check实例,您可以在运行时
require
您的
Oauth1
子类,而不是在模块初始化期间导入它:

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

您的问题与巴别塔无关。真正的问题是您的代码中有

要解决此问题,您应该从其父级
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');
    }
}
如果您不想从基类中删除
这个Auth
check实例,您可以在运行时
require
您的
Oauth1
子类,而不是在模块初始化期间导入它:

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

您的问题与巴别塔无关。真正的问题是您的代码中有

要解决此问题,您应该从其父级
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');
    }
}
如果您不想从基类中删除
这个Auth
check实例,您可以在运行时
require
您的
Oauth1
子类,而不是在模块初始化期间导入它:

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

您的问题与巴别塔无关。真正的问题是您的代码中有

要解决此问题,您应该从其父级
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');
    }
}
如果您不想从基类中删除
这个Auth
check实例,您可以在运行时
require
您的
Oauth1
子类,而不是在模块初始化期间导入它:

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


那么,是否没有办法实现所需的“工厂”效果,即实例化基类并让它根据传入的配置返回最佳子类?如果我只是让基类有一个作为工厂的静态方法呢?我明白了,这对我来说是可行的,但我失去了工厂模式,我想我仍然可以有一个单独的工厂对象来实现这一点。如果你想要/需要循环依赖,如果在
Auth.js
one之前只导入了
Oauth1.js
模块,那么原始代码就可以工作了。@LeonidBeschastny是否在ES6中运行时链接到require?我认为模块系统目前是静态的,是公认的折衷方案(未来…ES7?…发行版将在需要的地方恢复运行时。这可能是我的误解。感谢@Bergi,我暂时没有这么做,但很高兴知道这个选项存在于需要的地方,所以没有办法实现所需的“工厂”实例化基类并让它根据传入的配置返回最佳子类的效果如何?如果我只是让基类有一个作为工厂的静态方法如何?我看到了,它确实以这种方式为我工作,但我失去了工厂模式,我想我仍然可以有一个单独的工厂对象来实现这一点。如果您想要/需要循环依赖关系,那么如果在
Auth.js
one之前只导入
Oauth1.js
模块,那么原始代码就可以工作。@LeonidBeschastny在ES6中运行时与require链接?我认为模块系统目前是静态的,是公认的折衷方案(未来…ES7?…发行版将在需要的地方恢复运行时。这可能是我的误解。感谢@Bergi,我暂时不这么做,但很高兴知道在需要的地方存在此选项,所以没有办法实现所需的“工厂”实例化基类并让它根据传入的配置返回最佳子类的效果如何?如果我只是让基类有一个作为工厂的静态方法如何?我看到了,它确实以这种方式为我工作,但我失去了工厂模式,我想我仍然可以有一个单独的工厂对象来实现这一点。如果您想要/需要循环依赖关系,那么如果在
Auth.js
one之前只导入
Oauth1.js
模块,那么原始代码就可以工作。@LeonidBeschastny在ES6中运行时与require链接?我认为模块系统目前是静态的,是公认的折衷方案(未来的…ES7?…发行版会在需要的地方带回运行时。这可能是我的误解。谢谢@Bergi,我暂时没有提到它,但很高兴知道这个选项在需要的地方存在,所以没有办法实现所需的“工厂”效果,即实例化基类并让它根据配置返回最好的子类