如何重置JavaScript原语的原型[复制]

b91juud3  于 2023-06-20  发布在  Java
关注(0)|答案(2)|浏览(111)

此问题已在此处有答案

Recovering built-in methods that have been overwritten(1个答案)
How to recover overwritten native methods?(2个答案)
Call native javascript function that has been "erased" by the web page(1个答案)
Create a reset of javascript Array prototype when Array.prototype has been modified?(2个答案)
昨天关门了。
很多时候,我编写的JavaScript与其他脚本一起运行,或者可能包含其他脚本。有时这些脚本可能已经改变了我可能在代码中使用的基本对象的原型。
有没有一种方法可以在JavaScript中声明我的原始数据类型,以便在原型被修改时重置原型?或者让我的脚本在一个单独的作用域中运行,在这个作用域中原语的原型没有被修改?

// evil script code modify primative on prototype
Boolean.prototype.toString = function() {
  return true;
}

let flag = false;
console.log(flag.toString());
// I would expect false to be printed, but because the prototype of the primative if overridden 
// the primative value would be wrapped with the Boolean object 
// and call the modified toString method and would output true.

有没有什么方法可以确保我的代码在一个单独的作用域中运行,或者有没有什么方法可以声明我的变量或重置原型来避免这些类型的问题?

ni65a41a

ni65a41a1#

您可以冻结全局对象原型,但需要先运行脚本。它将阻止修改。
我不知道如何冻结全局功能。

Object.freeze(String.prototype);
Object.freeze(Number.prototype);
Object.freeze(Boolean.prototype);
Object.freeze(Object.prototype);
Object.freeze(Array.prototype);
Object.freeze(Date.prototype);
Object.freeze(Math.prototype);
Object.freeze(Function.prototype);

// evil script code modify primative on prototype
Boolean.prototype.toString = function() {
  return true;
}

// For this I don't know how to freeze
window.parseInt = function(number) {
  return 'evil'
}

let flag = false;
console.log(flag.toString());

console.log(parseInt(1));
cgvd09ve

cgvd09ve2#

恢复Boolean原型的原始toString方法

Boolean.prototype.toString = function() {
  return Boolean(this) ? 'true' : 'false';
};

let flag = false;
console.log(flag.toString());

请试试这个

相关问题