2016-07-11 15 views
3

はのは、私がfileA.jsにこのような単純なクラスがあるとしましょうES6モジュールを使用した単一クラスのメソッドのエクスポート/インポート<pre><code>class foo { constructor(x) { this.name = x } fooMethod(x) { return x + 'hello'; } } </code></pre> <p></p> そして、私はこのような<code>fileB.js</code>で<code>fooMethod</code>をインポートして使用したい:

私は fileAにして exportを書くとどのよう
import { fooMethod } from './fileA'; 

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

これを達成するには?

+1

'エクスポート{fooMethodとしてfoo.prototype.fooMethod}'働くかもしれません。 – gcampbell

+0

これをどのように呼び出す予定ですか? –

+0

@IlyaNovojilovいいえ、これは裸のメソッドではなく、クラスをエクスポートします。 – Lux

答えて

4

プロトタイプにエクスポートする必要があります。しかし、それを行うと、クラス/オブジェクトのコンテキストで関数を呼び出さないことに注意してください:

export foo.prototype. fooMethod 

しかし、私はそうしないことをお勧めします。


あなたのコメントにより、同じ基本クラスを拡張しない2つのクラスに共通の機能を持たせることをお勧めします。

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); 
    } 
} 
:1つの簡単な方法は、二つのクラスからユーティリティ関数をインポートすることです

これは良いパターンであり、単一の機能でうまく機能しますが、より複雑な機能を適用する場合は制限があります。これを達成するための良い方法は混合パターンである:

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

'foo'クラスのコンテキストで' fileB'の 'fooMethod'を取得する唯一の方法は、' 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

​​
+3

OPにはTSやAngularが使用されているので、あなたのサンプルには大きなノイズが含まれています。その上に、なぜこれがより良いのかを説明せず、 'fooMethod'が静的であるかもしれないという事実を見逃しました。 – ssube

関連する問題

 関連する問題