Javascript 原生原型与$扩展()

Javascript 原生原型与$扩展(),javascript,jquery,prototype,Javascript,Jquery,Prototype,在工作中,我们使用jQuery。在我们开始使用它后不久,我看到一些开发人员正在向jquery-extensions.js文件中添加函数。在里面,我发现了一大堆添加到$的方法,这些方法本质上相当于jQuery上的静态方法。以下是一些: $.formatString(str, args) { ... } $.objectToArray(obj) { ... } 等等,它们实际上都没有使用任何与jQuery相关的东西。我觉得这很奇怪 最后,我们需要在库中使用一个函数来本地化日期。我

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

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

$.objectToArray(obj) {
    ...
}
等等,它们实际上都没有使用任何与jQuery相关的东西。我觉得这很奇怪

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

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

Date.parseLocalDate = function() {
   ...
}
完成此操作后不久,一位高级开发人员向我走来,问我在做什么。他告诉我,在这里,我工作的地方,我们不创建原型,因为它们是邪恶的。他给出的唯一理由是,它们基本上是一种糟糕的语言特性,因为它们“可能被滥用”,而且看到原型(例如,我如何知道new Date()。toLocaleDate()是一个原型,而不是本机ECMAScript)很令人困惑。通过使用
$.formatString(…)
而不是
的“废话”.formatString(…)
,我们可以清楚地看到,任何带有$的内容都不是本机JavaScript的一部分

这些理由似乎有点愚蠢,但我提供了一个折衷方案,这样他就不必记住某个方法是否是原型前缀,原型函数名是否带有
$

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

"blah blah".$format(...);
这很快就被忽略了,现在我不得不到处添加这些$.myPrototypeAsAFauxStaticMethodOnjQuery()函数


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

  • 高级职称往往被高估
  • 有很多人不了解原型遗传
  • 即使扩展本机JavaScript对象的原型是合法的,也不要这样做。您将面临与框架冲突的风险
  • 对非jQuery实用程序函数劫持
    $
    是没有意义的。为什么不使用公司自己的名称空间?如果您需要简洁,请使用
    $$

  • 关于原生原型的争论有点累了,双方都有一些有效的观点,我将尝试总结它们,希望这可能有助于了解全局

    相反没有必要扩展本机原型。你需要的东西都有了。
    proJS标准库非常稀少。数组和字符串缺少许多重要特性

    conta使用函数或您自己的“名称空间”。
    pro
    foo.trim()
    这样的方法比像
    org.blah.trim(foo)
    这样的函数更符合语言的精神。一切都是javascript中的对象,就这样吧

    conta本机JS对象为语言设计者“保留”。我们的方法可能会意外地覆盖新添加的内置项
    pro开放对象是一个很好的功能,不使用它是很愚蠢的。新的Javascript版本并不是每天都会发生的事情,对标准的补充是众所周知的

    contra扩展本机原型令人困惑,因为我们的方法和本机方法之间没有区别
    proJS标准库很小,并且有很好的文档记录。我们javascript开发人员应该知道本机方法的名称

    conta扩展原型可能会导致命名空间冲突
    pro是的,但全局函数或众所周知的全局对象(如
    $
    )也会发生这种情况

    conta自定义方法是可枚举的
    pro是的,但是有
    hasOwnProperty
    需要救援。将其包装到您自己的枚举器函数中,并停止使用原始
    for..in
    对象循环


    (不是真正的答案,因此CW)

    我认为这并不愚蠢!,但使用原型更漂亮!,但又有谁在乎美呢?你的代码最终会很吓人,但是如果它有很好的文档和一致性,你就永远不需要考虑这些问题了

    如果你明白我的意思,他们只是想要
    $
    。“我是唯一一个认为这种做法愚蠢的人吗?”不。但是。。。请将此设置为社区Wiki,否则它将被关闭。更好的是,在@Kirk Woll上问这个问题:制作自己的帖子需要什么样的代表要求?(我知道编辑其他CW帖子需要100条。)这个“高级开发人员”是个白痴……所以不,你不是唯一一个认为这很愚蠢的人,它添加了一个不必要的依赖项,真的毫无意义。“重新打开类”可能会变得混乱,但是如果函数与jQuery无关,最好将它们分开保存(例如
    CompanyName.Util.OurMagicFormatters.formatString()
    )/sarcasm