2016-05-09 13 views
0

Betrachten Sie das folgende Beispiel:Erweiterung Selbst Container Funktionen Javascript

var FunctionName =() => { 
    return { 
    helloWorld() { console.log("hello world"); } 
    } 
}; 

var OtherFunctionName =() => { 
    return { 
    goodBye() { console.log("Bye Bye"); } 
    } 
}; 

Angenommen, ich habe nicht etwas syntaktisch falsch in der oben getan, wie würde ich verlängern FunctionName in OtherFunctionName so dass OtherFunctionName Zugang zu helloWorld hat ??

Da die Codebasis eine ES6-Klasse enthalten kann, ist es möglich, dieselbe Methode zu verwenden, um die Klasse in eine eigenständige Funktion zu erweitern, um Zugriff auf die Klassenmethoden zu erhalten?

So:

var FunctionName =() => { 
    return { 
    helloWorld() { console.log("hello world"); } 
    } 
}; 

class OtherClass { 
    goodBye() { console.log("Bye Bye"); } 
}; 

In diesem Fall würde FunctionNameOtherClass erweitern Zugang zu goodBye zu bekommen. Ist das möglich?

Was sind die Methoden, um eine eigenständige Funktion auf eine eigenständige Funktion zu erweitern.

und

Was sind die Methoden einer Klasse auf eine in sich geschlossene Funktion

Ist das zu erweitern, wo Object.assign oder lodashes ._extend würde sich als nützlich?

+1

Was meinen Sie mit einer "Selbstbehälter" (oder "in sich geschlossenen") Funktion? Suchen Sie etwas Komplizierteres als 'Object.assign (OtherFunctionName(), FunctionName())'? oder für das zweite Beispiel 'Object.assign (new OtherClass(), FunctionName())'? –

Antwort

1

Sie können, wenn Sie die Prototypen verwenden möchten, Object.create verwenden. Es ermöglicht Ihnen, ein Objekt mit einem bestimmten Prototyp zu erstellen. Weil Sie wollen nicht alles zu ‚Property-Deskriptoren‘ ändern, könnten Sie es mit Object.assign kombinieren:

var FunctionName =() => { 
    return Object.assign(Object.create(OtherClass.prototype), { 
    helloWorld() { console.log("hello world"); } 
    }) 
}; 

Wenn Sie Fabrik Funktionen und Klassen unterstützen wollen würde, würde dies tun:

var FunctionName =() => { 
    return Object.assign(
    OtherClass.prototype ? Object.create(OtherClass.prototype) : OtherClass(), { 
    helloWorld() { console.log("hello world"); } 
    }) 
}; 
+0

Würde das gleiche Konzept funktionieren, um den OtherFunctionName zu erweitern, um Zugriff auf seine Methoden zu erhalten? – TheWebs

+0

Nein, dann müssten Sie 'Object.create' mit' OtherFunctionName() 'als Argument verwenden, da Sie die Funktionen in diesem Objekt nur abrufen können, indem Sie es tatsächlich ausführen. Sie können prüfen, ob ".prototype" vorhanden ist, um festzustellen, ob Sie die eine oder andere Methode verwenden. –

+0

Können Sie Ihr Beispiel aktualisieren, um zu zeigen, wie das funktioniert? @MichielDral – TheWebs

1

Sie können es einfach instanziiert:

function FunctionName() { 
    return { 
    helloWorld() { console.log("hello world"); } 
    } 
} 

function OtherFunctionName() { 
    var x = FunctionName(); 
    // you now have access to x.helloWorld in here 
    return { 
    goodBye() { 
     x.helloWorld(); 
     console.log("Bye Bye"); 
    } 
    } 
} 

Dies sollte die gleiche Arbeit, wenn FunctionName ein Konstruktor keine Fabrik Spaß ction (verwenden Sie einfach new zur Instanziierung).