考虑这个伪代码:
(function(window){
var options = { /*where everything goes */ };
var instance = (function(options){
for (var i in options){
if (options.hasOwnProperty(i)){
this[i] = options[i];
}
}
})(options);
instance.callbacks = function(cb){
//...
}
instance.is_allowed = function()
//... checks, return boolean
}
window.instance = instance;
})(this);
如果有人想要操纵这段代码(例如恶意用户),他会is_allowed
用自己的函数重写该函数,例如使用地址栏(他没有 firebug,谁知道)。
javascript:(function(){ window.instance.is_allowed = function(){ return true; } })();
这是一个幼稚的例子,但这就是重点,Javascript 中的任何内容都可以被覆盖。
我知道在 es5 我们有 Object.defineProperty 所以你可以设置:
// being explicit
Object.defineProperty(instance, "is_allowed", {
enumerable: false,
configurable: false,
writable: false,
value: function(){
// do checks
}
});
实际上,从这个意义上说,最好的方法是使用Object.freeze(instance)
orObject.seal(instance)
代替Object.defineProperty
,因为后者可以再次调用writable: false
(傻吧?)
有没有什么方法可以在旧浏览器(即 IE6-8)中运行而没有太多麻烦?如果不可能,那我就耸耸肩继续前进。