Есть ли способ использовать window.hasOwnProperty () в Internet Explorer? - PullRequest
3 голосов
/ 06 марта 2009

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

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

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

Ответы [ 3 ]

31 голосов
/ 27 июля 2009

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

Object.prototype.hasOwnProperty.call(obj, p)
3 голосов
/ 07 марта 2009

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

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

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

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

getVarName('hello');

В этот момент ссылка на «temp» в качестве переменной теряется. Я предполагаю, что ваша функция 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 (), как указано выше, то, что вы делаете, не может работать должным образом, и вам, вероятно, стоит взглянуть на лучший способ достижения того, что вы делаете.

1 голос
/ 06 марта 2009

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

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

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

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

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