繁体   English   中英

我可以安全地扩展 javascript 内置类吗?

[英]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
  • 代码读起来很混乱,这是 ES5 特性还是自定义库?

它将像这样工作, Array.prototypeArray是可变的,因此您可以添加代码并调用属性。

然而:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM