有没有办法阻止用户覆盖原生函数?
示例:
var getRand;
(function(){
'use strict';
getRand = function(){
return Math.random();
}
})();
getRand(); //gives a nice random number
页面加载后,覆盖控制台。
Math.random = function (){ return 0 };
getRand(); //gives 0 :(
有没有办法阻止本机功能被覆盖?也许使用CSP或密封对象......这甚至可能吗?
答案 0 :(得分:4)
事实上,您可以使用Object.freeze(Math)
:
Object.freeze()方法冻结一个对象:即阻止new 属性被添加到它;防止现有属性 被删除;并防止现有的属性,或他们的 可更改性,可配置性或可写性。在 本质上,对象是有效不可变的。该方法返回 被冻结的物体。
Object.freeze(Math);
// This won't work or it won't replace
// the function with the whole string...
Math.random = "hello world";
除非任何其他库可能依赖于扩展或修改Math
(例如,可能 polyfill 可能需要向Math
添加函数或其他内容,但是之前说过,冻结内置物体只是一个可能的问题......)。
...使用Object.defineProperty(...)
修改现有的属性描述符:
Object.defineProperty(Math, "random", {
configurable: false,
writable: false
});