2016-07-11 13 views
3

Lassen Sie uns sagen, dass ich eine einfache Klasse wie diese haben in fileA.js:Einzelklassenmethode mit ES6-Modulen exportieren/importieren?

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

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

Und ich will und diese fooMethod in fileB.js wie verwenden importieren:

import { fooMethod } from './fileA'; 

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

Wie würde ich die export in fileA schreiben Dies erreichen?

+1

'Export {foo.prototype.fooMethod als fooMethod}' funktionieren könnte. – gcampbell

+0

Wie planen Sie, es aufzurufen? –

+0

@IlyaNovojilov Nein, das würde die Klasse exportieren, nicht die nackte Methode. – Lux

Antwort

4

Sie müssten es auf dem Prototyp exportieren. Aber denken Sie daran, dass, wenn Sie tun, dass Sie nicht die Funktion in der Klasse/Objektkontext nennen:

export foo.prototype. fooMethod 

aber ich würde Ihnen empfehlen, dies nicht zu tun.


Okay, aufgrund Ihres Kommentars mögen Sie eine gute Möglichkeit, eine gemeinsame Funktionalität für zwei Klassen haben, welche die gleiche Basisklasse nicht erweitern. Eine einfache Möglichkeit ist es, eine Nutzenfunktion von zwei Klassen zu importieren:

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); 
    } 
} 

Dies ist ein gutes Muster und funktioniert gut für eine einzelne Funktion, hat aber Grenzen, wenn Sie komplexere Funktionen anwenden möchten. Ein guter Weg, dies zu erreichen, ist ein Mischbild:

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) { 
    .. 
} 

Dadurch wird beim Mischen eine neue anonyme Klasse zwischen Ihrer Klasse 'A'/'B' und 'BaseA'/'BaseB' erstellt, die die allgemeine Funktion foo bietet.

+0

Der einzige Weg, 'fooMethod' in' fileB' mit dem Kontext der Klasse 'foo' zu bekommen, ist es, die gesamte' foo' Klasse zu importieren und 'fooMethod' daraus zu benennen? – Rotareti

+0

Nun, Sie brauchen ein Objekt, um einen Kontext zu haben, keine Klasse. Sie müssten also ein Objekt initialisieren. Vielleicht ein Singleton erstellen? – Lux

+0

Das Mischmuster sieht sehr interessant aus! Könnte ich eine Klasse mit mehreren foo-ähnlichen Klassen auf diese Weise erweitern: 'Klasse A erweitert fooOne (fooTwo (Base))'? – Rotareti

4

Sie haben es als separate Variable für den Export/konstant, wie folgt aus:

class Foo { 
    fooMethod() {}; 
} 

export const fooMethod = Foo.prototype.fooMethod; 

Siehe Babel/repl

bearbeiten

Es stellt sich in den Kommentaren, die Sie nicht wirklich tun brauche eine Instanzmethode (Du verwendest nicht this).Ich würde nur eine normale Funktion definieren und verwenden:

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

Es ist besser, Sie exportieren keine Methoden. Folgen Sie dies.

dateiA

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

In der Frage, dass das OP TS oder Angular verwendet, gibt es keine Hinweise. Ihr Beispiel hat also eine Menge Rauschen. Darüber hinaus erklären Sie nicht, warum dies besser ist und haben die Tatsache übersehen, dass "fooMethod" statisch sein kann. – ssube