使用 ES6 模块导出/导入单个类方法?

2024-05-31

假设我有一个像这样的简单课程fileA.js:

class foo {
    constructor(x) {
        this.name = x
    }

    fooMethod(x) {
        return x + 'hello';
    }
}

我想导入并使用fooMethod in fileB.js像这样:

import { fooMethod } from './fileA';

class bar() {
    ...
    barMethod(x) {
        return fooMethod(x);
    }
}

我该怎么写export in fileA为了达成这个?


您必须将其导出到原型上。但请记住,如果这样做,您将不会在类/对象上下文中调用该函数:

export foo.prototype. fooMethod

但我建议您不要这样做。


好的,根据您的评论,您希望有一种好方法来为两个类提供通用功能,而不扩展相同的基类。一种简单的方法是从两个类导入实用函数:

foo.js

export function foo() {
  return this.name;
}

a.js

import {foo} from 'foo';
export class A extends BaseA {
  foo() {
    foo.apply(this, arguments);
  }
}

b.js

import {foo} from 'foo';
export class B extends BaseB {
  foo() {
    foo.apply(this, arguments);
  }
}

这是一个很好的模式,对于单个函数来说效果很好,但如果您想应用更复杂的功能,则有限制。实现这一点的一个好方法是混合模式:

foo.js

export default superClass => class extends superClass {
  foo() {
    return this.name;
  }
};

a.js

import foo from 'foo';
export class A extends foo(BaseA) {
  ..
}

b.js

import foo from 'foo';
export class B extends foo(BaseB) {
  ..
}

这将使您的混合在类“A”/“B”和“BaseA”/“BaseB”之间创建一个新的匿名类,它提供通用功能foo.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ES6 模块导出/导入单个类方法? 的相关文章