如何防止在Javascript中更改变量值

时间:2012-10-25 08:49:19

标签: javascript static final

  

可能重复:
  Are there constants in Javascript?

有没有办法在javascript中声明最终值的静态,以便第三方不能更改它?

我所拥有的是文章共享应用程序,免费用户受广告支持。 我想做的是通过改变内容的存储变量来阻止免费用户改变innerHTML内容。

我目前所拥有的是一个计时器,每5秒钟在用户网站上重新加载文章的innerHTML,并且我将重载的值存储在一个变量中。

但是,如果使用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>

这将以压缩格式呈现,只是为了使代码复制出来更难。 这样,简单地复制和粘贴代码的工作量将最大化,并且很难实现自动化。

谢谢大家的回答。

2 个答案:

答案 0 :(得分:17)

是的,有。至少对于对象属性,ES5为我们提供了手动更改属性描述符标志的可能性。所以我们可以这样做

var data = { };

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

这样,我们在secret内创建了一个值为42的属性data,该属性无法修改也无法删除。

这里需要注意的是,天才(就像你所说的那样)也能够发现这个代码,只是修改它,如果他愿意,可以再次改变内容。您只是无法以这种方式创建安全的前端JavaScript。代码将始终以纯文本形式提供给每个人。


为了使其更加完整,您还可以使用Object.freeze()和/或Object.seal()创建一个对象freeze,以关闭枚举<的选项/ em>,删除修改对象的属性。

但请注意:这是为了影响您自己的代码或外国代码,以防止在运行时意外或故意修改。没有办法阻止开发人员,因为他甚至可以停止执行你的脚本,然后才能生效。

答案 1 :(得分:3)

尝试使用const关键字。它应该创建一个不可变的变量。