2016-09-10 7 views
-1

Ich möchte einen Prototyp auf String definieren, der eine sich selbst aufruft ist FunktionJavaScript - Prototyp als selbstaufrufende Funktion (IIFE)

String.prototype.overEstimatedLength = (function() { 
    return this.length + 12345 
})() 

und dann verwenden, wie dieses

'hello world'.overEstimatedLength 

Leider funktioniert das nicht. Ist sowas syntaktisch möglich und warum funktioniert das obige Beispiel nicht?

Hinweis: Ich weiß, dass Eigenschaftsdefinition besser geeignet wäre (z. B. ein Getter), ich bin speziell an selbstaufrufenden Funktionen interessiert.

+0

Was ist der Zweck der Erstellung eines Alias ​​für '.length'? Beachten Sie, 'das' mit IIFE ist nicht' String' – guest271314

+1

ist diese Art von Hausaufgaben? Es gab bereits eine verdächtige ähnliche Frage vor einer halben Stunde: http://stackoverflow.com/questions/39431230/add-an-aliass-for-a-property-in-javascript – vlaz

+2

Mögliche Duplikate von [Javascript Getter und Setter für Dummies?] (http://stackoverflow.com/questions/812961/javascript-getters-and-setters-for-dummies) – Siguza

Antwort

2

Das Problem mit Ihrem Beispiel ist, dass es nicht wirklich so etwas wie eine „self-Aufruf-Funktion“ ist, nur ein "sofort -invozierter Funktionsausdruck ", mit dem Schwerpunkt sofort.

Betrachten wir etwas wie folgt aus:

String.prototype.foo = alert('foo'); 
'foo'.foo; 
'foo'.foo; 

Dies läuft alert('foo')sofort, dann das Ergebnis in String.prototype.foo speichert. . . und ruft dann das Ergebnis nur ein paar Mal ab (nichts damit machen). So wird nur einmal alarmiert werden.

Ihr Beispiel ist ähnlich; Sie sind sofort Aufruf Ihrer Funktion Ausdruck.

+0

toll, danke, ich akzeptiere deine Antwort. – lustoykov

+0

@leo: Gern geschehen! – ruakh

1

Es scheint, wie Sie einen Getter auf String.prototype

Object.defineProperty(String.prototype, 'overEstimatedLength', { 
 
    get: function() { 
 
    return this.length + 12345; 
 
    } 
 
}); 
 
console.log('hello'.overEstimatedLength)

Ihr Code funktioniert nicht zu definieren versuchen, weil es Ihre Funktion sofort und Zuweisen des Ergebnisses, das zu String.prototype.overEstimatedLength ist die Ausführung . Das heißt, es ist fast genau das gleiche wie ...

function myFunc() { 
    return this.length + 12345 
} 
String.prototype.overEstimatedLength = myFunc(); 

Die folgende würde Art von Arbeit, aber Sie würden es als eine Funktion aufrufen, Beachten Sie, dass Sie eine Funktion zurückkehrt, so dass zu String.prototype zugewiesen bekommt

String.prototype.overEstimatedLength = (function() { 
 
    return function() { 
 
    return this.length + 12345; 
 
    } 
 
})() 
 

 
console.log('something'.overEstimatedLength())

Verwandte Themen