2016-07-11 3 views
3

Скажем, у меня есть простой класс, как это в fileA.js:экспорт/импорт метода одного класса с использованием модулей ES6?

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

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

И я хочу, чтобы импортировать и использовать fooMethod в fileB.js так:

import { fooMethod } from './fileA'; 

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

Как бы я написать export в fileA для добиться этого?

+1

'экспорт {foo.prototype.fooMethod в fooMethod}' может работать. – gcampbell

+0

Как вы планируете его вызывать? –

+0

@IlyaNovojilov no, это будет экспортировать класс, а не голый метод. – Lux

ответ

4

Вам придется экспортировать его на прототипе. Но помните, что если вы делаете, что вы не будете вызывать функцию в контексте класса/объекта:

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.

+0

Итак, единственный способ получить 'fooMethod' в' fileB' с контекстом класса 'foo' - это импортировать весь класс' foo' и вызвать из него 'fooMethod'? – Rotareti

+0

Ну, вам нужен объект, чтобы иметь контекст, а не класс. Таким образом, вам нужно будет инициализировать объект. Может быть, создать синглтон? – Lux

+0

Смешивание выглядит очень интересно! Могу ли я расширить класс с несколькими классами, подобными foo, следующим образом: 'class A extends fooOne (fooTwo (Base))'? – Rotareti

4

Вы должны экспортировать его в качестве отдельной переменной/константы, например:

class Foo { 
    fooMethod() {}; 
} 

export const fooMethod = Foo.prototype.fooMethod; 

См Babel/repl

Редактировать

Оказывается, в комментариях, что вы на самом деле не нужен метод экземпляра (вы не используете this).Я бы просто определил и использовал регулярную функцию:

export function fooMethod(x) { 
    return x + 1; 
} 
-2

Лучше не экспортировать методы. Следуйте за этим.

FiLea

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

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

app.component.ts

import { Component } from '@angular/core'; 
import { foo } from './fileA'; 

@Component({ 
    moduleId: module.id, 
    selector: 'app-root', 
    templateUrl: 'app.component.html', 
    styleUrls: ['app.component.css'] 
}) 
export class AppComponent { 
    title = 'app works!'; 
    constructor(private fooClass: foo){ 
     this.fooClass.fooMethod(''); 
    } 
} 
+3

В вопросе о том, что OP использует TS или Angular, нет никаких указаний, поэтому ваш пример имеет много шума. Кроме того, вы не объясняете, почему это лучше, и пропустили факт, что 'fooMethod' может быть статичным. – ssube

Смежные вопросы