[英]Can I safely extend javascript builtin classes?
我可以安全地扩展 Javascript 内置类,比如Array
吗?
即以下浏览器/环境将不起作用:
Array.prototype.double = function() { return this.concat(this); }
Array.twice = function(a) { return a.double(); }
Array.twice([1, 2, 3]) # => [1, 2, 3, 1, 2, 3]
取决于你对“工作”的定义。
原型扩展存在三个主要问题。
for .. in
它将像这样工作, Array.prototype
和Array
是可变的,因此您可以添加代码并调用属性。
然而:
Array.prototype.trolls = 42;
for (var k in []) {
alert(k === "trolls");
}
上面是一个例子,它打破for .. in
。 这很容易解决
Object.defineProperty(Array.prototype, "trolls", {
value: ...,
enumerable: false
});
(仅限 ES5。IE<9 中的中断。不能在传统引擎中模拟)
或与
for (var k in []) {
if ([].hasOwnProperty(k)) {
alert(k === "trolls");
}
}
出于这些确切的原因,我个人避免自动扩展本地程序。 但是我认为在你的库中有一个.extendNatives
函数是完全可以接受的,比如pd.extendNatives
安全地,不是真的 - 因为你不能确定你是唯一扩展它们的人,或者你实际上扩展了正确的方法(请参阅原型 - 我上次检查时,它扩展了内置类,这造成了严重破坏其他脚本对内置行为的期望)。 修改你不拥有的对象是一条通往非常棘手领域的道路(“哦,但这是实际内置的concat()
,还是其他一些脚本在我们背后改变了它?”)。
有关更详细的讨论,请参见例如: http : //perfectkills.com/extending-built-in-native-objects-evil-or-not/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.