2015-09-08 36 views
1

我想更改默認的window.location setter和getter函數。Javascript錯誤:循環__proto__值

以下代碼已成功工作。但是這個代碼只是工作有限的領域。

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 

我知道,不能在正常環境中重新定義的非可配置的屬性「位置」。我更改了綁定IDL屬性以在webkit庫中測試這些代碼。我怎麼解決這個問題?


我還有一個問題。當我運行以下代碼,我遇到了同樣的錯誤。(JSC - 的Javascript核心,SpiderMonkey的,的NodeJS)

var o1 = { p1: 1 }; 
var o2 = { p2: 2 }; 
o2.__proto__ = o1; 

var o3 = { p3: 3 }; 
o3.__proto__ = o2; 
o1.__proto__ = o3; 

JavaScriptCore的外殼(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

不要操縱'__proto__' –

+0

謝謝你回答我的問題。我的主要目的是檢測變化的window.location或在setter中注入一些代碼。你有什麼想法或方法嗎? Object.observe和Object.watch在webkit環境中尚不支持。但我可以將DOM對象更改爲可配置或可替換的。 – guest

+0

搜索JavaScript注入或查看AOP庫的來源,如何包裝原始對象。 –

回答

0

你真的在這兩種情況下創建一個原型鏈循環。
在閉包中,window是局部變量(因爲提升),因此您不要在全局窗口對象上創建原型循環。