2016-06-17 8 views
0

Ich erstelle eine einzigartig gestaltete JavaScript API namens Javascript-X. Anstatt die herkömmliche Methode zum Erstellen einer API zu verwenden, erstelle ich die gesamte API innerhalb einer einzelnen Variablen mithilfe einer Objektstruktur.Wie kann beim Aufruf einer Objektfunktion ohne die Klammer eine benutzerdefinierte Nachricht angezeigt werden, anstatt die gesamte Funktion zurückzugeben?

Das kann gut aussehen, "$ jx.ex()" gibt 'Hallo Welt' zurück, aber wenn Sie "$ jx.ex" eingeben, gibt es die gesamte Funktion zurück. Führen Sie das Code-Snippet aus, um zu sehen.

Die Frage ist, können Sie die Nachricht anpassen, die angezeigt wird, wenn Sie "$ jx.ex" eingeben?

$jx = { 
 
    ex: function() { 
 
    return ('Hello World.') 
 
    } 
 
}; 
 
console.log($jx.ex()); 
 
console.log($jx.ex.toString())

+1

Nein. Wenn Sie '.ex' statt' .ex() 'aufrufen, fragen Sie nach einer Funktionsreferenz, nicht nach einem Aufruf der Funktion, und genau das bekommen Sie. Die einzige Möglichkeit, ".ex" die Zeichenfolge zurückzugeben, wäre, wenn es sich um eine Eigenschaft mit der Zeichenfolge als Wert und nicht um einen Zeiger auf eine Funktion handelt. – Utkanos

+0

Ich habe die Frage mit Ihren Änderungen überarbeitet. –

Antwort

5

Wenn eine Objektfunktion, ohne die Klammer Aufruf, wie könnte es eine benutzerdefinierte Nachricht anzuzeigen, anstatt ganze Funktion der Rückkehr?

Wenn Referenzierung ein Objekt Funktion ohne Klammern, es sei denn, Sie new verwenden, sind Sie nicht es nennen, Sie verweisen nur darauf. Z.B .:

// There are no function calls here 
var x = $jx.ex; 

Wenn Benutzer Ihrer API die oben tun, x wird ein Verweis auf die Funktion, nicht eine Zeichenfolge.

Die Frage ist, können Sie die Nachricht anpassen, die angezeigt wird, wenn Sie "$ jx.ex" eingeben?

Wenn Sie dies in der Konsole tun und die gesamte Funktion zu sehen, kann es sein, dass die Konsole auf String dazu gezwungen (die toString nennt), oder es kann sein, dass die Konsole etwas auf einem niedrigeren Niveau tat.

$jx = { 
 
    ex: function() { 
 
    return ('Hello World.') 
 
    } 
 
}; 
 
$jx.ex.toString = function() { 
 
    return "This is the custom 'message'."; 
 
}; 
 
console.log($jx.ex());   // A call 
 
console.log($jx.ex);    // Not a call, results will 
 
           // vary from console to console 
 
console.log($jx.ex.toString()); // toString directly 
 
console.log(String($jx.ex));  // toString indirectly

+0

Sie sind ein Lebensretter. Wenn es dir nichts ausmacht, kannst du mir Skype hinzufügen? –

+0

@AvenDyke: Sorry, am besten, Dinge vor Ort zu halten. –

1

Betrachten Sie unter Beispiel: Wenn die ehemaligen, wir, dass, indem sie die Funktion ein neues toString außer Kraft setzen können

Während im ersten Beispiel kann die Implikation nicht Es ist offensichtlich, dass das zweite Beispiel deutlicher zeigt, dass wir einer Funktion, die 2 Parameter hat, eine Variable mit dem Namen Multiplizieren zuweisen, und dieses Konzept von Funktionen als Zuweisungen ist in javascr allgemein üblich ipt. Dies ist eine kleine Demonstration der Tatsache, dass Funktionen "erstklassige Bürger" sind, dh sie können genau so weitergegeben werden, als würden wir Werte weitergeben.

So nun zu der Differenz der Zuordnung:

var operator = 3; 
var operand = 4; 
var ret = Multiply(operator, operand); 

An der Stelle der RET Variable zu definieren, Multiplizieren ausgeführt wird, und der Rückgabewert zugeordnet ist - RET wird auf 12 gleich.

Lets versuchen, das wieder eine andere Art und Weise:

var operator = 3; 
var operand = 4; 
var ret = Multiply; 

nun an dem Punkt zu definieren, ret, ret wird Ihre Multiply-Funktion im Gegensatz das aus Ihrer Multiply-Funktion erhaltene Ergebnis zu sein. Anrufe auf ret() wird Ihre Multiplikationsfunktion verursachen ausgeführt werden, und Sie können es genau nennen, als ob Sie angerufen hatte Multiply (Operator, Operand):

var out = ret(3, 4); 

ist die gleiche wie

var out = Multiply(3, 4);