2015-09-08 2 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 

Я знаю, что не может переопределить неконфигурируемое свойство «location» в нормальной среде. Я изменил свойства привязки IDL для проверки этого кода в библиотеке webkit. Как я могу решить эту проблему?


У меня есть другой вопрос. Когда я бегу следующие коды, я встретил ту же самую ошибку. (Оао - 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 или ввести некоторые коды в сеттер. У вас есть идеи или методы? Object.observe и Object.watch еще не поддерживаются в среде webkit. Но я могу изменить объект DOM для настройки или замены. – guest

+0

Ищите инъекцию javascript или посмотрите на источник AOP libs, как можно обернуть исходные объекты. –

ответ

0

Вы действительно создали прототип цепной петли в обоих случаях.
В замыкании window является локальной переменной (из-за подъема), поэтому вы не создаете цикл прототипа для глобального объекта окна.

Смежные вопросы