我想更改默认的window.location setter和getter函数。
以下代码成功运行。但这个代码只是工作有限的区域。
var _window = window;
(function () {
window = {};
var window = {};
Object.defineProperty(window, 'location', {
get: function () { alert('called getter '); return _window.location; },
set: function () { alert('not in my house'); }
});
window.__proto__ = _window;
alert('window.location : '+ window.location);
}());
当我删除块时,
var _window = window;
window = {};
var window = {};
Object.defineProperty(window, 'location', {
get: function () { alert('called getter '); return _window.location; },
set: function () { alert('not in my house'); }
});
window.__proto__ = _window;
alert('window.location : '+ window.location);
我遇到了以下错误。
ERROR Error: cyclic __proto__ value
我知道无法重新定义不可配置的属性" location"在正常环境中。我已经更改了绑定IDL属性以在webkit库中测试这些代码。我该如何解决这个问题?
我有另一个问题。当我运行以下代码时,我遇到了同样的错误。(jsc - Javascript Core,Spidermonkey,nodejs)
var o1 = { p1: 1 };
var o2 = { p2: 2 };
o2.__proto__ = o1;
var o3 = { p3: 3 };
o3.__proto__ = o2;
o1.__proto__ = o3;
JavascriptCore shell(jsc)
Exception: Error: cyclic __proto__ value
node.js(v0.10.25)
Error: Cyclic __proto__ value
Spidermonkey JavaScript-C24.2.0
1.js:7:0 TypeError: cyclic __proto__ value
相关吗?谢谢^^
答案 0 :(得分:0)
你真的在这两种情况下创建了一个原型链循环
在闭包中,window
是局部变量(因为提升),因此您不会在全局窗口对象上创建原型循环。
答案 1 :(得分:0)
var o1 = { p1: 1 };
var o2 = { p2: 2 };
var o3 = { p3: 3 };
o2.__proto__ = o1;
o1.__proto__ = o3;
o3.__proto__ = o2;
VM432:7 Uncaught TypeError: Cyclic __proto__ value
at Object.set __proto__ [as __proto__] (<anonymous>)
at <anonymous>:7:14
原因:如果我们尝试在一个圆圈中分配__proto__
,则JavaScript会引发错误。引用不能以圆圈形式出现。