Как предотвратить изменение значения переменной в Javascript [duplicate]

Возможный дубликат:
Есть ли константы в Javascript?

Есть ли способ объявить статическое окончательное значение в JavaScript, чтобы он не мог быть изменен третьей стороной?

У меня есть приложение для обмена статьями, где бесплатные пользователи поддерживаются рекламой. Что я хочу сделать, так это запретить свободным пользователям изменять содержимое innerHTML, изменяя переменную хранения для содержимого.

На данный момент у меня есть таймер, который перезагружает innerHTML статьи на сайте пользователя каждые 5 секунд, и я сохраняю значение для перезагрузки в переменной.

Однако, если гений, использующий jsbeatify, исследует, какая переменная содержит ключ к удалению рекламы, и изменяет это, мы теряем доход и влияние наших продуктов.

Как предотвратить изменение внутренней переменной?

ОБНОВИТЬ

Это конечный результат того, что я придумал:

http://jsfiddle.net/PgdYP/1/

<div id="specialdiv"></div>
<input type="button" value="try to change the function i to do something different" onclick="t.i = function(){alert(data.secret);}"><BR>
<input type="button" value="set function to null out of spite" onclick="t=null;">


 <script type="text/javascript">
    e = function(){var data = { };
    Object.defineProperty(data, 'secret', {
       value: "Hello world!",
       writable : false,
       enumerable : true,
       configurable : false
       });this.z=function(){window.setTimeout("try{document.getElementById('specialdiv').innerHTML =   '"+data.secret+"';t.i.z();}catch(err) {document.body.innerHTML=err;}",5000);}}
        g = function(){};
        g.prototype = new e();e=null;window.t = {}
        Object.defineProperty(window.t, 'i', {
        value: new g(),
        writable : false,
        enumerable : false,
        configurable : false });g = null;
        window.t = Object.freeze(window.t); t = Object.seal(window.t);
        t.i.z();
    </script>

Это будет представлено в упакованном формате, просто чтобы было сложнее просто скопировать код из исходного кода. Таким образом, усилия по простому копированию и вставке кода будут максимизированы, и их будет очень сложно автоматизировать.

Спасибо всем за ваши ответы.

 Tom Sarduy25 окт. 2012 г., 10:54
 Esailija25 окт. 2012 г., 10:53
Вам не нужно заботиться о тех немногих пользователях, которые могут это сделать, нет способа контролировать страницу после ее загрузки в браузерах пользователей.
 Jacob George25 окт. 2012 г., 10:51
как назывался сайт, над которым вы снова работали?

Ответы на вопрос(2)

Const ключевое слово. это должно создать неизменяемую переменную.

 Ramesh25 окт. 2012 г., 10:58
интересно ... но я не думаю, что IE реализует это
 jartaud14 февр. 2016 г., 07:48
@ Рамеш, ты имеешь в виду Google Chrome?caniuse.com/#feat=const
 le_m13 июн. 2016 г., 05:20
const делаетне сделать переменную неизменной.const a = []; a.push(1); работает. Это просто предотвращает повторное объявление или повторное назначение переменной.
 jartaud15 февр. 2016 г., 03:57
@ Рамеш икр? черная овца побеждает в этом. : D
 Ramesh15 февр. 2016 г., 02:49
@jartaud - А я и не подозревал, что Chrome реализует это частично. Но когда я написал комментарий в 2012 году, IE 10 был последним стабильным выпуском, и он также не поддерживал const :)
Решение Вопроса

Да, есть. По крайней мере длясвойства объектаES5 дал нам возможность изменитьдескриптор свойства Флаги от руки. Таким образом, мы можем сделать это как

var data = { };

Object.defineProperty(data, 'secret', {
    value: 42,
    writable : false,
    enumerable : true,
    configurable : false
});

Таким образом, мы создали свойствоsecret со значением42 вdata, который не может быть изменен или удален.

Предостережение здесь в том, чтогениальность (как вы это называли) также сможет обнаружить этот код и просто изменить его, чтобы снова иметь возможность изменять содержимое, если он этого пожелает. Ты тольконе может таким образом создайте защищенный интерфейсный javascript. Код всегда будет доступен в виде простого текста для всех.

Чтобы сделать это более полным, вы также можете создать объект иfreeze это в какой-то момент, используяObject.freeze() и / илиObject.seal() отключить опцию дляEnumerating, удаление а такжемодифицирующий на свойствах объекта.

Но опять же слово предостережения: Это предназначено для воздействия на ваш собственный или чужой код, чтобы предотвратить изменения случайно или преднамеренно во время выполнения. Нет способа остановить разработчика, так как он может простостой выполнение вашего сценария, прежде чем это даже может повлиять.

 le_m13 июн. 2016 г., 05:19
Примечание. Если заданное вами значение свойства является не примитивным типом данных, а объектом, его можно изменить (только не переназначить).
 Tschallacka25 окт. 2012 г., 11:13
Причина в том, что я хочу, чтобы это не изменялось при загрузке и после этого с помощью кода JavaScript. Я знаю, что невозможно все заклеить, но я хочу, чтобы было как можно сложнее изменить вывод сценария, когда он находится на их сайте. Этот порог есть для любого, кто хочет «обмануть» между усилием и результатом. Таким образом, я поднимаю планку еще на одну ступеньку. Спасибо.
 alexandernst25 окт. 2012 г., 10:58
@ michael-dibbets Просто чтобы прояснить ситуацию еще дальше. Вы не можете защититьчто-нибудь, Компании тратят миллионы на системы безопасности, которые спустя несколько месяцев становятся объектами безопасности. Вы не просто закодируете следующую большую анти-уязвимую вещь ... в любом случае ...
 Kate29 мая 2014 г., 15:58
+1 за фразу «Нет возможности остановить разработчика ...»!

Ваш ответ на вопрос