2009-05-13 10 views
4

ich direkt eine Funktion aufrufen kann wie soJavascript-Funktion in einem Objekt/hash

alert("Hello World!"); // pops up an alert window 

jedoch (I alert als Beispiel verwenden werden), wenn ich eine Funktion in einem Objekt setzen, nannte es nicht mehr funktioniert:

d = {func: alert}; 
d.func("Hello World!"); // doesn't do anything 
d["func"]("Hello World!"); // also doesn't do anything 

ich vielleicht dachte ich explizit benötigt, um in einem leeren this Argument übergeben, also versuchte ich

d.func(null, "Hello World!") // still nothing 

aber ohne Erfolg. Interessanterweise tut dies

d.func.apply(null, ["Hello World!"]); // success! 

arbeiten, aber das ist so grundlos ausführliche es meine Zähne (Zitat JWZ) verletzt macht. Gibt es einen prägnanteren, weniger hässlichen Weg?

Antwort

4

Funktionen in JavaScript sind vorbei Wert. Die alert()-Funktion ist nativ implementiert, dh sie hat keinen JavaScript-Wert. Abhängig von Ihrem Browser, variiert die mittlere Feinfühligkeit (verzeihen Sie mir dafür) dieses nativen Wrappers. Ihr Code funktioniert tatsächlich in Google Chrome, funktioniert aber nicht in Firefox, und von ganz oben werde ich sagen, dass er auch in Internet Explorer nicht funktioniert, was im Allgemeinen nicht freundlich ist, native Objekte zu ändern und Funktionen. Sie könnten stattdessen das folgende verwenden:

d = { 
    func: function (message) { 
     alert(message); 
    } 
}; 
+0

Ahh, Sie scheinen richtig zu sein. Das Überprüfen der Warnung sagt mir, dass es nicht alle Eigenschaften hat, die reguläre Javascript-Objekte haben, da es "eingebaut" ist, wie Sie sagen. Vielen Dank für das Testen in Chrome und für das Erklären des Verhaltens. –

+1

Ich habe eigentlich eine Änderung zu machen - es funktioniert nicht in Chrome ... die ganze Zeit. Der Code, genau wie Sie ihn geschrieben haben, verursacht einen ungültigen Aufruffehler. Wenn Sie jedoch einfach einen Verweis auf die Warnung im globalen Namespace vornehmen, z. B .: var myAlert = alert; myAlert ("Hallo, Welt!"); // Funktioniert! Das sieht wie kniffeliges Browserverhalten für mich aus. –

3

Wenn Sie versuchen, diese:

function test(x) { 
    alert(x); 
} 
var x = {func: test} 
x.func('Hi!'); 

Es funktioniert wie erwartet. Wenn ich versuche, dies direkt zu tun alert gibt Firebug mir die folgende Fehlermeldung:

[Exception... "Cannot modify properties of a WrappedNative" 
nsresult: "0x80570034 (NS_ERROR_XPC_CANT_MODIFY_PROP_ON_WN)" 
location: "JS frame :: http://stackoverflow.com/questions/859466/javascript-function-in-an-object-hash :: anonymous :: line 72" data: no] 

So vermute ich, es ist eine Sicherheit Sache oder etwas zu tun, damit eine native Funktion zu sein.

+0

Interessant - ich habe diese Nachricht in Firebug nicht erhalten, also denke ich, dass meine Version sich anders verhält. Ich schätze, dass dieses Problem nur auf die Alarmfunktion beschränkt ist und benutzerdefinierte Funktionen gut funktionieren. Ich kann jedoch keinen Grund für dieses Verhalten herausfinden - wir modifizieren den Alarm in keiner Weise, daher kann ich nicht sagen, warum dies schädlich wäre. –

1

Ich habe immer so gemacht:

var d = Object; 

d.hello = function(msg) { 
        alert(msg) 
        }; 

d.hello('hello'); 

Natürlich können Sie auch PrototypeJS können alle objektorientiert zu bekommen:

var Message = Class.create({ 
       display: function(msg) { 
        alert(msg); 
       } 
      }); 

var msg = new Message(); 

msg.display('hello'); 
Verwandte Themen