Existe-t-il un moyen d'utiliser window.hasOwnProperty () dans Internet Explorer?

J'ai une méthode qui fonctionne parfaitement dans Firefox, avec laquelle je peux déterminer le nom d'une instance d'un objet javascript particulier (ne demandez pas pourquoi j'en ai besoin …). Fr exemple:

var temp = new String("hello!"); var theName = getVarName(temp); //returns "temp" 

Cette méthode utilise "window.hasOwnProperty ()" qui ne fonctionne pas dans Internet Explorer: des suggestions?

J'ai une méthode qui fonctionne parfaitement dans Firefox, avec laquelle je peux déterminer le nom d'une instance d'un objet javascript particulier

Je ne pense pas que vous le faites, car ce n'est pas possible en JavaScript. JS est une langue appelée par valeur; Lorsque vous écrivez:

 var temp= 'hello'; getVarName(temp); 

C'est exactement le même que dire:

 getVarName('hello'); 

À ce moment, la référence à 'temp' en tant que variable est perdue. Ce que je suppose que votre fonction getVarName fonctionne est fondamentalement ceci:

 function getVarName(value) { for (var name in window) { if (window[name]===value) return name; } } 

Cela fonctionnera sur IE et d'autres navigateurs sans Object.hasOwnProperty (); Il renverra simplement le nom de toute variable globale qui correspond à l'argument. L'appel hasOwnProperty () peut être ajouté à cette fonction pour l'affiner un peu en autorisant uniquement les propriétés directes de la fenêtre (qui agissent comme des variables globales, y compris celles que vous définissez explicitement) et non de l'un de ses prototypes. Je suppose que c'est ce que votre version de la fonction fonctionne, mais en pratique, elle a très peu d'effet car presque rien ne hérite de «fenêtre» par un prototype.

Vous confondez un peu en boxant votre 'hello' dans un objet String explicite (ce qui est très inhabituel et rarement une bonne idée), ce qui permet d'avoir deux objets 'hello' différents qui ne sont pas compatibles avec le == = Comparateur d'identité, donc cela fonctionnera:

 var a= new String('hello!'); var b= new String('hello!'); getVarName(a); // 'a' getVarName(b); // 'b' - distinguishable object from a 

Mais cela ne vous empêche pas de faire:

 var a= new String('hello!'); var b= a; getVarName(a); // 'a' or 'b', depending on implementation getVarName(b); // the same 'a' or 'b' as in the previous call 

Ainsi, alors que vous pouvez perdre de manière inoffensive l'appel hasOwnProperty () comme ci-dessus, ce que vous faites ne peut pas vraiment fonctionner correctement et vous devriez probablement regarder une meilleure façon d'atteindre tout ce que vous êtes.

Si pour quelque raison que ce soit, vous devez utiliser la fenêtre, utilisez:

 Object.prototype.hasOwnProperty.call(obj, p) 

N'utilisez pas de variables globales. Toujours les mettre dans des espaces de noms afin que vous ne rencontrez pas ces problèmes.

Si j'ai bien compris, vous voulez le nom de variable global lorsque vous avez donné la valeur sous n'importe quelle portée. Par exemple, les éléments suivants devraient également fonctionner

 var temp = "hello"; function foo(x) { alert(getVarName(x)); //returns "temp" as well. } foo(temp); 

Il s'agit d'une sorte de recherche hash inversée sur l'objet Window qui n'est pas seulement coûteux, car il faut itérer sur toutes les propriétés de l'objet fenêtre chaque fois, mais aussi peu fiable (deux variables peuvent avoir une même valeur).