关于static:如何防止在Javascript中更改变量值

How to prevent the changing of a variable value in Javascript

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Are there constants in Javascript?

有没有一种方法可以在javascript中声明一个最终值的静态值,以便第三方无法更改它?

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

我现在拥有的是一个计时器,它每5秒在用户网站上重新加载文章的innerhtml,我将重新加载的值存储在一个变量中。

然而,如果一个使用jsbeatify的天才探索了哪一个变量持有删除广告的关键,并改变了这一点,那么我们将失去我们产品的收入和曝光。

如何防止内部变量的变化?

更新

这是我最终得出的结论:

http://jsfiddle.net/pgdyp/1/

1
2
<input type="button" value="try to change the function i to do something different" onclick="t.i = function(){alert(data.secret);}">
<input type="button" value="set function to null out of spite" onclick="t=null;">
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 <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();

这将以压缩格式显示,只是为了使从源代码中复制代码更加困难。这样,简单地复制和粘贴代码的工作将最大化,并且很难实现自动化。

谢谢大家的回答。


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

1
2
3
4
5
6
7
8
var data = { };

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

这样,我们在data中创建了一个值为42secret属性,既不能修改也不能删除。

这里要注意的是,天才(就像你所说的)也能够发现这个代码并修改它,如果他愿意的话,可以再次更改内容。你不能用这种方式创建一个安全的前端javascript。代码将始终以纯文本形式提供给所有人。

为了使这个更完整,您还可以创建一个对象,并在某个时刻使用Object.freeze()和/或Object.seal()关闭枚举、删除和修改对象属性的选项。

但同样要注意的是:这是为了影响您自己的代码或外部代码,以防止意外或在运行时故意修改。没有办法阻止开发人员,因为他可以在脚本生效之前简单地停止执行。


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