我正在使用谷歌浏览器16.0.912.63并具有以下代码:
__defineGetter__('x', function(){
console.log('In Getter: x'); return 1;
});
__defineGetter__('undefined', function(){
console.log('In Getter: undefined'); return 2;
});
console.log(x);
console.log(undefined);
正确输入x
的getter函数,但从未输入undefined的getter。记录到我的控制台的输出是:
In Getter: x
1
undefined
我始终认为undefined
的行为与任何其他全局变量相同。我知道如
undefined = 10;
undefined = null;
undefined = 'defined';
这些都是有效的,所以undefined
的不同之处在于它无法获得getter(至少在我的浏览器中)。
答案 0 :(得分:3)
它的行为与任何普通变量不同,它只是假装,至少在Firefox和Chrome上。试试吧:
var x;
undefined = "Hello!";
x === undefined; // true; undefined doesn't change
它更像是一个只读属性,但在写入时不会抛出错误。
答案 1 :(得分:2)
似乎__defineGetter__
只是默默地失败了。 Object.defineProperty
会抛出错误:
redefine_disallowed
当你在Chrome上调用它时:
Object.defineProperty(window, "undefined", {
get: function() {
return 2;
}
});
另一方面:
window.__defineGetter__("undefined", function() {
return 2;
});
window.__lookupGetter__("undefined"); // undefined, so __defineGetter__ just ignored call
为什么它在Chrome的控制台中有效:
当您在控制台中粘贴代码时,一次定义和获取undefined
时,它可以正常工作,因为正在执行的一些函数使用{{1阻止引用with
:
console._commandLineAPI
所以你只是定义if (injectCommandLineAPI && inspectedWindow.console) {
inspectedWindow.console._commandLineAPI = new CommandLineAPI(
this._commandLineAPIImpl,
isEvalOnCallFrame ? object : null
);
expression = "with ((window && window.console && window.console._commandLineAPI) || {}) {\n" + expression + "\n}";
}
return evalFunction.call(object, expression);
。
另一点是它会覆盖console._commandLineAPI.undefined
(参见上面的代码),所以如果你定义并获取console._commandLineAPI
作为两个命令它就不起作用,因为getter被覆盖掉掉了你试图获得undefined
的时间。
这个以及它不会覆盖undefined
的事实,很可能是它在控制台中运行的原因。