扩展Object.prototype JavaScript

Lim*_*ime 34 javascript ecmascript-5

我不是在问这是否合适:

Object.prototype.method = function(){};
Run Code Online (Sandbox Code Playgroud)

几乎每个人都认为这是邪恶的,因为它会混乱for(var i in obj).

真正的问题

忽略

  • 不称职的浏览器(不支持的浏览器Object.defineProperty)
  • 财产碰撞或覆盖的可能性

假设你有一些非常有用的方法,这被认为是错误的/不道德的吗?

Object.defineProperty(Object.prototype, 'methodOnSteriods',{
  value: function(){ /* Makes breakfast, solves world peace, takes out trash */ },
  writable: true,
  configurable: true,
  enumerable: false
});
Run Code Online (Sandbox Code Playgroud)

如果你认为上述内容是不道德的,为什么他们甚至会首先实现这个功能呢?

Ale*_*yne 23

如果它适用于您的目标环境,我认为它很好.

此外,我认为原型扩展偏执狂被夸大了.只要你hasOwnProperty()像一个好的开发者一样使用它就可以了.最糟糕的情况是,您在其他地方重载该属性并丢失该方法.但如果你这样做,这是你自己的错.

  • 我相信`Object.prototype`特别具有奇怪的边缘情况副作用.但我不确定这是否仅限于传统浏览器.扩展任何其他原型是安全的. (2认同)

hug*_*omg 11

我会说这几乎和以前一样邪恶.最大的问题,仍然和以前一样,是Object.prototype是全局的.虽然你的方法目前可能正在解决世界和平问题,但它可能会覆盖其他人的方法(这可以保证银河的和平),或者将来可能会被一些你无法控制的图书馆覆盖(因此再次让世界陷入混乱)


新版本的Javascript具有许多与属性相关的功能,例如将属性定义为可枚举/不可枚举,具有getter和setter ... Object.defineProperty存在是为了控制它.

来自Mozilla Docs:

该方法允许精确地添加或修改对象上的属性.通过赋值添加的正常属性会创建在属性枚举期间显示的属性(对于... in循环),其值可能会更改,并且可能会被删除.此方法允许从默认值更改这些额外的详细信息.


这个新功能基本上是支持新功能所必需的,你应该在你自己的东西上使用它.能够修改Object.prototype只是它的一个副作用,它也是一个"正常"的对象,就像以前一样邪恶.