Ответ 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(), как указано выше, то, что вы делаете, не может работать должным образом, и вам, вероятно, следует взглянуть на лучший способ добиться того, чем вы занимаетесь.