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这样的框架有类似的方法,这是正确的吗?
像这样的猴子修补内置类是一个有争议的话题。我个人不喜欢这样做,原因有两个:
内置类是全局范围的。这意味着如果两个不同的模块尝试将同名的方法添加到全局类中,那么它们将会发生冲突,从而导致微妙的错误。更微妙的是,如果浏览器的未来版本决定实现同名的方法,您也会遇到麻烦。
在公共类的原型中添加内容可能会破坏使用 for-in 循环而无需进行 hasOwnProperty 检查的代码(JS 新手经常对对象和数组执行此操作,因为 for-in 看起来像 foreach 循环)。如果您不能 100% 确定您使用的代码是否安全地使用 for-in 循环,那么 Monkeypatching Object.prototype 可能会导致问题。
也就是说,在一种情况下,我发现 Monkeypatching 内置函数是可以接受的,那就是在旧浏览器上添加新浏览器的功能(例如,数组的 forEach 方法)。在这种情况下,您可以避免与未来的浏览器版本发生冲突,并且不太可能让任何人感到意外。但即便如此,我仍然建议使用第三方的填充程序,而不是自己编码,因为通常有许多棘手的极端情况很难正确处理。
| 归档时间: |
|
| 查看次数: |
483 次 |
| 最近记录: |