Есть ли способ использовать window.hasOwnProperty() в Internet Explorer?

У меня есть метод, который отлично работает в Firefox, с помощью которого я могу определить имя экземпляра конкретного javascript-объекта (пожалуйста, не спрашивайте, зачем мне это нужно...). Пример:

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

Этот метод использует "window.hasOwnProperty()", которые не работают в Internet Explorer: любые предложения?

Ответы

Ответ 1

У меня есть метод, который отлично работает в Firefox, с которым я могу определить имя экземпляра конкретного объекта javascript

Я не думаю, что вы это делаете, потому что это невозможно в JavaScript. JS - это язык вызова по значению; когда вы пишете:

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

что точно так же, как сказать:

getVarName('hello');

В этот момент теряется ссылка на "temp as a variable". Я предполагаю, что ваша функция getVarName делает это в основном:

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

Это будет работать с IE и другими браузерами без Object.hasOwnProperty(); он просто вернет имя любой глобальной переменной, которая соответствует аргументу. Вызов hasOwnProperty() может быть добавлен к этой функции, чтобы немного усовершенствовать его, только разрешив прямые свойства окна (которые действуют как глобальные переменные, включая те, которые вы задали явно), а не какой-либо из его прототипов. Я предполагаю, что то, что делает ваша версия функции, но на практике она имеет очень мало эффекта, поскольку почти ничего не наследуется в "окне по прототипу".

Вы немного путаете вещи, боксируя свое "привет" в явном объекте String (что очень необычно и редко бывает хорошей идеей), что позволяет иметь два разных "привет" объекта, которые можно различить, используя === компаратор идентичности, поэтому это будет работать:

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

Но это все еще не мешает вам:

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

Итак, хотя вы можете без опасений потерять вызов hasOwnProperty(), как указано выше, то, что вы делаете, не может работать должным образом, и вам, вероятно, следует взглянуть на лучший способ добиться того, чем вы занимаетесь.

Ответ 2

Если по какой-либо причине вам нужно использовать окно, используйте:

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

Ответ 3

Не используйте глобальные переменные. Всегда помещайте их в пространства имен, чтобы вы не сталкивались с такими проблемами.

Если я правильно понял, вы хотите, чтобы имя глобальной переменной присваивалось значению в любой области. Например, следующее должно работать также

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

Это вид обратного хеш-поиска на объекте Window, который не только дорог, так как вам нужно каждый раз перебирать все свойства окна-объекта, но также и ненадежны (две переменные могут иметь одинаковое значение).