本地原型 vs $.extension()

10

在工作中,我们使用jQuery。不久之后,我发现一些开发人员正在向jquery-extensions.js文件中添加函数。在里面,我发现了很多在$上添加的方法,这些方法本质上相当于jQuery上的静态方法。以下是其中的一些:

$.formatString(str, args) {
    ...
}

$.objectToArray(obj) {
    ...
}

等等。它们实际上都没有使用任何与jQuery相关的内容。这让我感到很奇怪。

最终,我们需要在我们的库中创建一个本地化日期的函数。我的解决方案是创建:

Date.prototype.toLocaleDate = function() {
    ...
}

Date.parseLocalDate = function() {
   ...
}

我这样做后不久,一位高级开发者就过来问我在做什么。他告诉我,在我们公司,我们不创建原型对象,因为它们是邪恶的。他唯一给出的理由是,它们本质上是一种糟糕的语言特性,因为它们“可能被滥用”,并且看到原型(例如,如何知道new Date().toLocaleDate()是原型而不是本地的ECMAScript)很令人困惑。通过使用$.formatString(...)而不是"blah blah".formatString(...),我们清楚地表明任何带有$的内容都不是JavaScript的本地部分。

这些理由似乎有点荒谬,但我提出了一个妥协方案,这样他就不必记住方法是否是原型函数 - 用$前缀来命名原型函数:

String.prototype.$format = function() {
    ...
}

"blah blah".$format(...);

这个想法很快被否决了,现在我不得不在各处添加这些$.myPrototypeAsAFauxStaticMethodOnjQuery()函数。

我是唯一认为这种做法很愚蠢的人吗?


3
他们只是想要“钞票”,如果你明白我的意思。 - BoltClock
我是唯一一个认为这种做法很愚蠢的人吗?不是。但是...请将其设为社区Wiki,否则它将被关闭。更好的方法是在http://programmers.stackexchange.com上提问。 - Kirk Woll
@Kirk Woll:制作自己的帖子CW需要多少声望要求?(我知道编辑其他CW帖子需要100声望。) - BoltClock
1
这个“高级开发人员”是个白痴……所以不,你不是唯一一个认为这很愚蠢的人,它增加了不必要的依赖,而且完全没有任何意义。 - Nick Craver
“重新打开类”可能会变得混乱,但如果一个函数与jQuery无关,将它们分开可能是一个更好的主意(例如CompanyName.Util.OurMagicFormatters.formatString())/讽刺 - glebm
这与原型对象本身并不邪恶有关,而是与修改 “本地” JavaScript 类型的原型对象有关。Prototype 库会毫不保留地这样做,这既是好事也是坏事(尤其是对于 Object 的修改)。你可以采取的一种方法是扩展原生 Date 对象,这可能不太难(可惜对于数组不起作用)。 - Pointy
3个回答

4
本地原型的争论有点过时了,双方都有合理的观点,我尝试总结一下,希望能对把握全局有所帮助。
反对:没有必要扩展本地原型。你已经拥有了所有需要的东西。 支持:JS标准库极度缺乏。数组和字符串缺少许多重要功能。
反对:使用函数或自己的“命名空间”。 支持:像foo.trim()这样的方法比像org.blah.trim(foo)这样的函数更符合语言精神。在JavaScript中,一切都是对象,就让它保持这样吧。
反对:本机JS对象是“保留”的,供语言设计者使用。我们的方法可能会意外覆盖新添加的内置内容。 支持:开放对象是一个很棒的功能,不使用它是愚蠢的。新的Javascript版本并不是每天都会发生的事情,标准的增加也是预先知道的。
反对:扩展本地原型很令人困惑,因为我们和本地方法之间没有区别。 支持:JS标准库很小,文档很好。我们javascript开发人员应该知道本地方法的名称。
反对:扩展原型可能会导致命名空间冲突。 支持:是的,但这也可能发生在全局函数或众所周知的全局对象(如$)中。
反对:自定义方法是可枚举的。 支持:是的,但有hasOwnProperty来解救。将其包装在自己的枚举器函数中,并停止使用原始的for..in循环与对象。
(不是真正的答案,因此CW)

1
  1. 高级职称往往被高估了。
  2. 有很多人不理解原型继承。
  3. 尽管扩展本机JavaScript对象的原型是合法的,但不要这样做。你会冒着与框架冲突的风险。
  4. 为非jQuery实用函数劫持$没有意义。为什么不使用公司自己的命名空间?如果需要简洁,可以使用$$等。

0

我认为这并不愚蠢!但使用原型会更美观!但是,谁又在乎美感呢?你的代码最终可能会变得可怕且糟糕,但如果它有良好的文档和一致性,你永远不需要考虑这些问题!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接