覆盖JavaScript对象和函数的危险

ser*_*0ne 6 javascript ecmascript-5 typescript

JavaScript的本质允许完全重写其本机对象.我想知道这样做是否真的有危险!

以下是本机JavaScript对象的一些示例

Object
Function
Number
String
Boolean
Math
RegExp
Array
Run Code Online (Sandbox Code Playgroud)

让我们假设我想对这些模型进行建模,以遵循您在Java(和其他一些OOP语言)中可能找到的类似模式,以便Object定义一组基本函数,并且每个其他对象继承它(这必须是明确的)用户定义,与Java不同,其中一切都自然地来自对象)

例:

Object = null;
function Object() {
   Object.prototype.equals = function(other) {
      return this === other;
   }

   Object.prototype.toString = function() {
      return "Object";
   }

   Object.equals = function(objA, objB) {
      return objA === objB;
   }
}

Boolean = null;
function Boolean() {
}
extend(Boolean, Object);  // Assume extend is an inheritance mechanism

Foo = null;
function Foo() {
   Foo.prototype.bar = function() {
      return "Foo.bar";
   }
}

extend(Foo, Object);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,Object和Boolean现在有了新的实现.在这方面,可能会发生什么?我可能会进一步打破局面吗?

编辑:

我在某处读过像MooTools和Prototype这样的框架有类似的方法,这是正确的吗?

hug*_*omg 4

像这样的猴子修补内置类是一个有争议的话题。我个人不喜欢这样做,原因有两个:

  1. 内置类是全局范围的。这意味着如果两个不同的模块尝试将同名的方法添加到全局类中,那么它们将会发生冲突,从而导致微妙的错误。更微妙的是,如果浏览器的未来版本决定实现同名的方法,您也会遇到麻烦。

  2. 在公共类的原型中添加内容可能会破坏使用 for-in 循环而无需进行 hasOwnProperty 检查的代码(JS 新手经常对对象和数组执行此操作,因为 for-in 看起来像 foreach 循环)。如果您不能 100% 确定您使用的代码是否安全地使用 for-in 循环,那么 Monkeypatching Object.prototype 可能会导致问题。

也就是说,在一种情况下,我发现 Monkeypatching 内置函数是可以接受的,那就是在旧浏览器上添加新浏览器的功能(例如,数组的 forEach 方法)。在这种情况下,您可以避免与未来的浏览器版本发生冲突,并且不太可能让任何人感到意外。但即便如此,我仍然建议使用第三方的填充程序,而不是自己编码,因为通常有许多棘手的极端情况很难正确处理。