我不是问这是否可以:
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
});
如果您认为以上内容不道德,他们为什么要首先实施该功能?
下面的原始答案,为了后代,因为堆栈溢出不会让我删除已接受的答案。
我还认为原型扩展偏执狂被夸大了。只要您像优秀的开发人员一样使用
hasOwnProperty()
就没问题。最坏的情况是,您在别处重载该属性并丢失该方法。但如果你这样做,那是你自己的错。
几乎和以前一样邪恶。最大的问题,仍然和以前一样,是 Object.prototype 是全局的。虽然您的方法目前可能正在解决世界和平,但它可能已经覆盖了其他人的方法(保证银河系和平),或者将来可能会被您无法控制的某个库覆盖(因此再次使世界陷入混乱)
来自
Mozilla Docs:
此方法允许精确添加或修改属性 在一个物体上。通过分配创建的正常属性添加 在属性枚举期间显示的属性(for...in 循环), 其值可能会更改,并且可能会被删除。这个方法 允许从默认值更改这些额外的详细信息。
// Add a method conditionally. from "JavaScript: the good parts"
Function.prototype.method = function (name, func) {
if (!this.prototype[name]) {
this.prototype[name] = func;
}
}
.hasOwnProperty()
将通过继承的属性排除迭代,我个人发现这通常比有用更烦人。它在很大程度上打败了
Object.create()
的用处——这具有讽刺意味,因为说服每个人都做
.hasOwnProperty()
的同一个人也提升了
Object.create()
.Object.prototype 不应该被扩展,原因在这里列出。如果你真的想扩展它,那么让扩展不可迭代。
我意识到这与所有已发布的最佳实践背道而驰,但我们真的应该停止“强制”
.hasOwnProperty()
对象键迭代并拥抱直接对象到对象继承的有用性。
在做之前,有几个注意事项需要做好:
1.迭代对象时使用hasOwnProperty
,但这并不是真正的预防措施,当迭代对象时,我已经在使用
hasOwnProperty
了。2.检查
name
中的
Object.prototype.name
是否已经存在,这样很安全,避免名字冲突。3.利用
Object.defineProperty()
,只需添加额外的保护层即可。