扩展 Object.prototype JavaScript

问题描述 投票:0回答:5

我不是问这是否可以:

Object.prototype.method = function(){};

几乎每个人都认为这是evil,考虑到它搞砸了

for(var i in obj)
.

真正的问题

无视

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

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

Object.defineProperty(Object.prototype, 'methodOnSteriods',{ value: function(){ /* */ }, writable: true, configurable: true, enumerable: false });
如果您认为以上内容不道德,他们为什么要首先实施该功能?

javascript ecmascript-5
5个回答
26
投票
2021 年更新

尽管这是公认的答案,但 10 年的经验告诉我这不是最好的主意。为避免污染全局范围,您可以做的几乎所有事情都是一件非常非常好的事情。

下面的原始答案,为了后代,因为堆栈溢出不会让我删除已接受的答案。


2011年的原始答案

我觉得如果能在你的目标环境下运行就好了

我还认为原型扩展偏执狂被夸大了。只要您像优秀的开发人员一样使用

hasOwnProperty()

 就没问题。最坏的情况是,您在别处重载该属性并丢失该方法。但如果你这样做,那是你自己的错。


11
投票
我会说这

几乎和以前一样邪恶。最大的问题,仍然和以前一样,是 Object.prototype 是全局的。虽然您的方法目前可能正在解决世界和平,但它可能已经覆盖了其他人的方法(保证银河系和平),或者将来可能会被您无法控制的某个库覆盖(因此再次使世界陷入混乱)


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

来自

Mozilla Docs

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


这个新功能基本上是支持新功能所必需的,您应该在自己的东西上使用它。能够修改 Object.prototype 只是它也是一个“普通”对象的副作用,并且和以前一样邪恶。


4
投票
在“JavaScript: the good parts”中有一个类似的功能,我认为这对改进 javascript 基础对象(如 String、Date 等)非常有用,但仅此而已。

// Add a method conditionally. from "JavaScript: the good parts" Function.prototype.method = function (name, func) { if (!this.prototype[name]) { this.prototype[name] = func; } }
    

3
投票

.hasOwnProperty()

 将通过继承的属性排除迭代,我个人发现这通常比有用更烦人。它在很大程度上打败了 
Object.create()
 的用处——这具有讽刺意味,因为说服每个人都做 
.hasOwnProperty()
 的同一个人也提升了 
Object.create()
.

Object.prototype 不应该被扩展,原因在这里列出。如果你真的想扩展它,那么让扩展不可迭代。

我意识到这与所有已发布的最佳实践背道而驰,但我们真的应该停止“强制”

.hasOwnProperty()

 对象键迭代并拥抱直接对象到对象继承的有用性。


0
投票
简短的回答是肯定的,你应该这样做。

在做之前,有几个注意事项需要做好:

1.迭代对象时使用
hasOwnProperty

,但这并不是真正的预防措施,当迭代对象时,我已经在使用
hasOwnProperty
了。
2.检查
name
中的
Object.prototype.name
是否已经存在,这样很安全,避免名字冲突。
3.利用
Object.defineProperty()
,只需添加额外的保护层即可。

如您所见,它并不复杂。

一旦您解决了风险/缺点,现在优势就来了:
1. 方法链,这只会让代码更易读、更简洁,让编码更愉快。反过来让你更快乐,你的生活更轻松。
2.解决了浏览器兼容性问题,反正你在做polyfill

附言:
与大型团队合作时绝对不要这样做。

© www.soinside.com 2019 - 2024. All rights reserved.