Javascript错误:循环__proto__值

时间:2015-09-08 17:35:56

标签: javascript node.js webkit

我想更改默认的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

相关吗?谢谢^^

2 个答案:

答案 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会引发错误。引用不能以圆圈形式出现。