原生原型与$ .extension()

时间:2010-09-25 20:21:38

标签: javascript jquery prototype

在工作中,我们使用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()函数。

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

3 个答案:

答案 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)

  1. 高级职称经常被高估。
  2. 有很多人不了解原型继承。
  3. 即使扩展原生JavaScript对象的原型是合法的,也不要这样做。你冒着与框架发生冲突的风险。
  4. 对非jQuery实用程序函数劫持$没有意义。为什么不使用公司自己的命名空间?如果您需要简明扼要,请使用$$等。

答案 2 :(得分:0)

我觉得这不是傻瓜!但是使用原型更漂亮了!但是又如何关心美女呢?你的代码最终会变得可怕而且will suck,但如果它有详细记录且一致,你将永远不需要考虑这些问题!