javascript - 为什么扩展 native 对象是一种不好的做法?

标签 javascript prototype prototypal-inheritance

每个 JS 意见领袖都说扩展 native 对象是一种不好的做法。但为什么?我们的表现会受到影响吗?他们是否担心有人“以错误的方式”这样做,并向 Object 添加可枚举类型,实际上破坏了任何对象上的所有循环?

TJ Holowaychukshould.js例如。他adds a simple getterObject 并且一切正常(source)。

Object.defineProperty(Object.prototype, 'should', {
  set: function(){},
  get: function(){
    return new Assertion(Object(this).valueOf());
  },
  configurable: true
});

这真的很有道理。例如,可以扩展 Array

Array.defineProperty(Array.prototype, "remove", {
  set: function(){},
  get: function(){
    return removeArrayElement.bind(this);
  }
});
var arr = [0, 1, 2, 3, 4];
arr.remove(3);

有反对扩展原生类型的论点吗?

最佳答案

当你扩展一个对象时,你改变了它的行为。

更改仅由您自己的代码使用的对象的行为是可以的。但是,当您更改其他代码也使用的某些行为时,您就有可能破坏其他代码。

当方法被添加到 javascript 中的对象和数组类时,破坏某些东西的风险非常高 - 由于 javascript 的工作方式。多年的经验告诉我,这种东西会导致 javascript 中出现各种可怕的错误。

如果您需要自定义行为,最好定义自己的类(也许是子类)而不是更改 native 类。这样你就不会破坏任何东西。

能够在不创建子类的情况下改变类的工作方式是任何优秀编程语言的重要特征,但必须很少使用并谨慎使用。

关于javascript - 为什么扩展 native 对象是一种不好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14034180/

相关文章:

javascript - Backbone.js:模型继承导致共享数据

javascript - XmlHttpRequest onload `this` 属性

php - 使用 SJCL 在 Javascript 中加密并在 PHP 中解密

javascript - Canvas :点击图像

javascript - *在*构造函数中声明的属性在实例中可见。为什么?

javascript - 在 'this' 和对象的原型(prototype)方法中使用 'constructor' 时如何正确返回值?

javascript - 用作事件处理程序的 Javascript 原型(prototype)函数内部 'this' 的值

javascript - 时钟选择器不显示时钟

javascript - 原型(prototype):应用与调用、新建与创建

javascript可链接嵌套子类