回顾:
好的,我已经有一段时间没有问这个问题了。像往常一样,我去增加了Object.prototype
无论如何,尽管在这里和网络上的其他地方都有反对它的所有有效论据。我想我就是那种固执的混蛋。
我试图想出一个确凿的方法来防止新方法破坏任何预期的行为,这被证明是一件非常困难但内容丰富的事情。
我学到了很多关于 JavaScript 的东西。至少我不会尝试像弄乱本机原型那样鲁莽的事情(String.prototype.trim
IE < 9 除外)。
在这种特殊情况下,我不使用任何库,所以冲突不是我主要关心的问题。但是,在使用原生原型时,我更深入地研究了可能出现的事故,我不太可能尝试将此代码与任何库结合使用。
通过研究这种原型方法,我对模型本身有了更好的理解。我将原型视为某种形式的灵活的传统抽象类,使我坚持传统的 OOP 思维。这种观点并没有真正做到原型模型公正。道格拉斯·克罗克福德 (Douglas Crockford) 写了关于这个陷阱的文章,可悲的是,粉红色的背景让我无法阅读全文。
我决定更新这个问题,因为阅读这篇文章的人很想亲眼看看。我只能说:无论如何,做。我希望你在决定放弃这个相当愚蠢的想法之前,像我一样学习一些简洁的东西。一个简单的函数可能同样有效,甚至更好,尤其是在这种情况下。毕竟,它真正的美妙之处在于,只需添加 3 行代码,您就可以使用相同的函数来增强特定对象的原型。
我知道我要问一个已经存在了很长一段时间的问题,但是:为什么 Object.prototype 被认为是禁区?它就在那里,并且可以像任何其他原型一样进行增强。那么,为什么不应该利用这一点。在我看来,只要你知道自己在做什么,就没有理由避开 Object 原型。
以这种方法为例:
if (!Object.prototype.getProperties)
{
Object.prototype.getProperties = function(f)
{
"use strict";
var i,ret;
f = f || false;
ret = [];
for (i in this)
{
if (this.hasOwnProperty(i))
{
if (f === false && typeof this[i] === 'function')
{
continue;
}
ret.push(i);
}
}
return ret;
};
}
基本上,这是相同的旧for...in
循环,您可以在函数中保持安全,或者一遍又一遍地编写。我知道它将被添加到所有对象中,并且由于 JavaScript 中几乎每个继承链都可以追溯到 . Object.prototype
,但在我的脚本中,我认为它是两害相权取其轻。
也许,有人可以比这个小伙子更好地告诉我我错在哪里,等等。
在寻找人们不去触摸 's 原型的原因时,Object
一件事不断出现:它打破了for..in
循环,但又一次:许多框架也这样做,更不用说你自己的继承链了。因此.hasOwnProperty
,在我看来,在遍历对象的属性时不包括检查是不好的做法。
我也觉得这很有趣。再说一遍:有一条评论非常明确:扩展原生原型是不好的做法,但如果 V8 人这样做,我还能说他们错了吗?
我知道,这个论点并不完全成立。
关键是:我真的看不出上面的代码有问题。我喜欢它,经常使用它,到目前为止,它没有让我失望过一次。我什至正在考虑将更多功能附加到对象原型。除非有人能告诉我为什么我不应该,否则就是这样。