有没有办法在Internet Explorer中使用window.hasOwnProperty()?

时间:2009-03-06 17:17:54

标签: javascript internet-explorer

我有一个方法,在Firefox中完美有效,我可以用它确定特定javascript对象实例的名称(请不要问我为什么需要它...)。 Fr示例:

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

此方法使用“window.hasOwnProperty()”,它在Internet Explorer中无效:任何建议?

3 个答案:

答案 0 :(得分:31)

如果出于某种原因需要使用窗口,请使用:

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

答案 1 :(得分:3)

  

我有一个方法,在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;
    }
}

这适用于没有Object.hasOwnProperty()的IE和其他浏览器;它将只返回与参数匹配的任何全局变量的名称。可以将hasOwnProperty()调用添加到此函数中,通过仅允许窗口的直接属性(其充当全局变量,包括您明确设置的那些)而不是其任何原型来稍微优化它。我猜这是你的函数版本正在做什么,但在实践中它几乎没有影响因为几乎没有任何东西继承到'window'原型。

通过在显式的String对象中装入你的'hello',这会让你感到困惑(这是非常不寻常的,很少有好主意),这使得有可能使用两个不同的'hello'对象,这些对象是不可分割的===身份比较器,所以这将起作用:

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 :(得分:1)

不要使用全局变量。始终将它们放在名称空间中,这样就不会遇到这样的问题。

如果我理解正确,那么在给定任何范围内的值时,您需要全局变量名称。例如,以下内容也应该起作用

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

这是对Window对象的反向哈希查找,这不仅昂贵,因为您需要每次迭代窗口对象的所有属性,但也不可靠(两个变量可以具有相同的值)。