gpt4 book ai didi

javascript - 覆盖 JavaScript 对象和函数的危险

转载 作者:数据小太阳 更新时间:2023-10-29 05:23:27 24 4
gpt4 key购买 nike

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

这里有一些原生 JavaScript 对象的例子

Object
Function
Number
String
Boolean
Math
RegExp
Array

假设我想对这些进行建模以遵循您可能在 Java(和其他一些 OOP 语言)中找到的类似模式,以便 Object 定义一组基本功能,并且每个其他对象继承它(这将有由用户明确定义,与 Java 不同,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);

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

编辑:

我在某处读到 MooTools 和 Prototype 等框架对此有类似的方法,这是正确的吗?

最佳答案

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

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

  2. 向通用类的原型(prototype)中添加东西可能会破坏使用 for-in 循环而不进行 hasOwnProperty 检查的代码(JS 新手经常对对象和数组这样做,因为 for-in 有点像 foreach环形)。如果您不能 100% 确定您使用的代码正在安全地使用 for-in 循环,那么 monkeypatching Object.prototype 可能会导致问题。

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

关于javascript - 覆盖 JavaScript 对象和函数的危险,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14220413/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com