在工作中,我们使用jQuery。在我们开始使用它之后不久,我看到一些开发人员正在向文件jquery-extensions.js添加函数。在里面,我发现了一大堆添加到$
的方法,这些方法实际上相当于jQuery上的静态方法。这里有几个:
$.formatString(str, args) {
...
}
$.objectToArray(obj) {
...
}
等。 他们实际上都没有使用任何与jQuery 相关的东西。这让我很奇怪。
最终,我们需要在我们的库中使用一个函数来本地化日期。我的解决方案是创建:
Date.prototype.toLocaleDate = function() {
...
}
Date.parseLocalDate = function() {
...
}
这样做之后不久,我找到了一位高级开发人员,向我询问我认为我在做什么。他告诉我,在这里,我工作的地方,我们不创造原型,因为它们是邪恶的。他给出的唯一理由是它们基本上是一种糟糕的语言特征,因为它们“可能被滥用”并且看到原型会很困惑(例如,我如何知道新的Date()。toLocaleDate()是原型而不是原生的ECMAScript )。通过使用$.formatString(...)
代替"blah blah".formatString(...)
,我们清楚地表明任何带有$的内容都不是本机JavaScript的一部分。
这些原因似乎有些愚蠢,但我提出了妥协,所以他不必记住方法是否是原型函数名称$
的原型前缀:
String.prototype.$format = function() {
...
}
"blah blah".$format(...);
很快被解雇了,现在我不得不在任何地方添加这些$ .myPrototypeAsAFauxStaticMethodOnjQuery()函数。
我是唯一一个认为这种做法很愚蠢的人吗?
答案 0 :(得分:3)
本土原型辩论有点累,双方都有一些有效的观点,我会试着总结一下,希望看到大局可能有用。
contra 没有必要扩展原生原型。你有你需要的一切 专家 JS标准库稀缺到极致。数组和字符串缺少许多重要功能。
contra 使用函数或您自己的“命名空间”
专家像foo.trim()
这样的方法远比org.blah.trim(foo)
这样的函数更符合语言的精神。一切都是javascript中的对象,让它成为那样。
contra 本地JS对象是语言设计者的“保留”。我们的方法可能会意外地覆盖新添加的内置函数。
专家打开对象是一个很棒的功能,如果不使用它就很傻。新的Javascript版本不是每天都会发生的事情,并且标准的添加事先是众所周知的。
contra 扩展原生原型令人困惑,因为我们和本机方法之间没有区别。
专家 JS标准库规模小,文档齐全。我们javascript开发人员应该知道本机方法的名称。
contra 扩展原型可能会导致名称空间冲突。
pro 是的,但这可能发生在全局函数或众所周知的全局对象(如$
)上。
contra 自定义方法是可枚举的。
亲是的,但有hasOwnProperty
来救援。将其包装在您自己的枚举器函数中,并停止对对象使用原始for..in
循环。
(不是真正的答案,因此CW)
答案 1 :(得分:1)
$
没有意义。为什么不使用公司自己的命名空间?如果您需要简明扼要,请使用$$
等。答案 2 :(得分:0)
我觉得这不是傻瓜!但是使用原型更漂亮了!但是又如何关心美女呢?你的代码最终会变得可怕而且will suck,但如果它有详细记录且一致,你将永远不需要考虑这些问题!