2009-05-13 6 views
4

je peux appeler une fonction directement (je vais utiliser alert comme exemple) comme sifonction Javascript dans un objet/hachage

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

Cependant, quand je mets une fonction dans un objet, en l'appelant ne fonctionne:

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

je me suis dit que je devais peut-être passer explicitement dans un argument this vide, alors j'ai essayé

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

mais en vain. Fait intéressant, cela ne fonctionne

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

mais qui est si bavard, il fait à titre gratuit mes dents mal (pour citer JWZ). Y a-t-il une manière plus concise, moins laide?

Répondre

4

fonctions en JavaScript sont passés par valeur. La fonction alert() est implémentée de manière native, ce qui signifie qu'elle n'a pas de valeur JavaScript. Selon votre navigateur, la méchanceté (pardonnez-moi) de cet emballage natif varie. Votre code fonctionne réellement dans Google Chrome, mais ne fonctionnera pas dans Firefox, et je vais dire que cela ne fonctionnera pas non plus dans Internet Explorer, qui n'est généralement pas amical sur la modification des objets natifs et les fonctions. Vous pourriez utiliser ce qui suit à la place:

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

Ahh, vous semblez avoir raison. L'inspection de l'alerte m'indique qu'elle ne possède pas toutes les propriétés que possèdent les objets Javascript habituels, puisqu'elle est "intégrée" comme vous le dites. Merci d'avoir testé dans Chrome et d'avoir expliqué le comportement. –

+1

J'ai en fait un amendement à faire - cela ne fonctionne pas dans Chrome ... tout le temps. Le code, exactement comme vous l'avez écrit, provoque et erreur d'invocation illégale. Toutefois, si vous faites simplement référence à l'alerte dans l'espace de noms global, c'est-à-dire: var myAlert = alert; myAlert ("Bonjour, monde!"); // Travaux! Cela ressemble à un comportement de navigateur finicky pour moi. –

3

Si vous essayez ceci:

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

Il fonctionne comme prévu. Quand j'essayer de faire cela alert directement Firebug me donne le message d'erreur suivant:

[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] 

donc je devine que c'est une chose de sécurité ou quelque chose à voir avec ce qui est une fonction native.

+0

Intéressant - Je n'ai pas reçu ce message dans Firebug, donc je suppose que ma version se comporte différemment. Je suppose que ce problème est juste limité à la fonction d'alerte et les fonctions définies par l'utilisateur fonctionnent très bien. Cependant, je ne peux pas trouver de raison pour ce comportement - nous ne modifions pas l'alerte de quelque façon que ce soit, donc je ne peux pas dire pourquoi cela serait nuisible. –

1

Je l'ai toujours fait comme ceci:

var d = Object; 

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

d.hello('hello'); 

Bien sûr, vous pouvez également utiliser PrototypeJS pour obtenir tout orienté objet:

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

var msg = new Message(); 

msg.display('hello'); 
Questions connexes