2017-12-11 1 views
0

Wie kann ich das gesamte Objekt der Self-Inv-Funktion zurückgeben, ohne alle Funktionen manuell zurückgeben?return ganze selbst aufrufen Funktionen

ich mit der folgenden Lösung versuchen will, die aber sollen in der Regel arbeiten, funktioniert es nicht:

var publish = (function() { 
    var pub = {}; 

    pub.hello = function() { 
     return "test" 
    }; 

    return pub; 

}()); 

jetzt "pub" aufrufbar sein müssen abonnieren:

var subsribe = (function(pub) { 

    function hello() { 
     return pub.hello(); 
    }; 

}(publish)); 

Ich habe beide Dateien im Browser geladen (zuerst Pub).

jedoch:

Debugger sagt: Reference: pub nicht definiert.

+0

Sie meinen, ohne Angabe jeder Methode, die Sie bereitstellen möchten? Denke nicht, dass das möglich ist. – Jamiec

+0

Eine Immobilie kann nicht gleichzeitig öffentlich (zugänglich) und privat (unzugänglich) sein. – destoryer

Antwort

1

Ich glaube, Sie sie so schreiben wollen:

var publish = (function() { 
 
    var pub = {}; 
 

 
    pub.hello = function() { 
 
    return "test" 
 
    }; 
 

 
    return pub; 
 

 
})(); 
 

 

 
var subsribe = (function(pub) { 
 

 
    function hello() { 
 
    return pub.hello(); 
 
    }; 
 

 
    console.log(hello()); 
 
})(publish);

Allerdings kann eine globale wiederverwendbare Sammlung von Funktionen auf andere Weise, eleganter vielleicht erreicht werden :) (separate Datei mit Export, Singleton mit diesen Methoden verziert)

1

Sie können nicht.

In JS gibt es keinen Mechanismus, um eine Liste von Variablen im aktuellen Bereich zu erhalten.

Selbst wenn Sie könnten, wäre das wahrscheinlich keine gute Idee, da es keine Möglichkeit gibt, zwischen öffentlichen und privaten Variablen zu unterscheiden.

0

Es gibt keinen solchen Mechanismus aber man kann so etwas tun:

var publish = (function() { 
 
    const me = this; 
 
    let publicMethods = ['hello', 'bye']; 
 

 
    // private 
 
    function _hello() { 
 
    return "test"; 
 
    }; 
 

 
    function _bye() { 
 
    return "end test"; 
 
    }; 
 

 
    publicMethods.forEach((methodName) => { 
 
    let privateMethod = eval('_' + methodName); 
 

 
    Object.defineProperty(me, methodName, { 
 
     get: function() { 
 
     return privateMethod; 
 
     } 
 
    }); 
 
    }); 
 
    return this; 
 

 
}()); 
 

 
console.log(publish.hello); 
 
console.log(publish.bye); 
 
console.log(publish.hello()); 
 
console.log(publish.bye());

+0

Ich habe den obigen Code geändert: Ich habe Pub als lokale Variable verwendet, binde alle Methoden und gebe das zurück, aber es funktioniert nicht. – nimo23

+0

@ nimo23 du hast etwas falsch gemacht, da meine Probe funktioniert :) – bluehipy

+0

Ich habe deine Version nicht genommen, schau oben. Ich habe den ganzen Code geändert und benutze eine Variable "pub", die alle Funktionen enthält und sie zurückgibt, also muss sie für andere öffentlich sein. hat aber nicht funktioniert .. – nimo23