原生原型与$ .extension()

Can*_*ain 10 javascript jquery prototype

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

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

$.objectToArray(obj) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

等等.它们实际上都没有使用任何与jQuery有关的东西.这让我很奇怪.

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

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

Date.parseLocalDate = function() {
   ...
}
Run Code Online (Sandbox Code Playgroud)

在这之后不久,我找到一位高级开发人员来找我问我认为我在做什么.他告诉我,在这里,我工作的地方,我们不创造原型,因为它们是邪恶的.他给出的唯一理由是它们基本上是一种糟糕的语言特征,因为它们"可能被滥用"并且看到原型会很困惑(例如,我如何知道新的Date().toLocaleDate()是原型而不是原生的ECMAScript ).通过使用$.formatString(...)而不是"blah blah".formatString(...),我们清楚地表明任何带有$的东西都不是本机JavaScript的一部分.

这些原因看起来有些愚蠢,但我提出了妥协,所以他不必记住方法是否是原型函数名称的原型前缀$:

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

"blah blah".$format(...);
Run Code Online (Sandbox Code Playgroud)

很快就被解雇了,现在我不得不在各处添加这些$ .myPrototypeAsAFauxStaticMethodOnjQuery()函数.

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

use*_*291 4

原生原型的争论有点累,双方都有有效的观点,我将尝试总结它们,希望对了解大局有所帮助。

相反没有必要扩展原生原型。你已经拥有了你需要的一切。
pro JS标准库稀缺到了极点。数组和字符串缺乏许多重要的功能。

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

相反, Native JS 对象是为语言设计者“保留”的。我们的方法可能会意外地覆盖新添加的内置函数。
pro打开对象是一个很棒的功能,不使用它就太愚蠢了。新的 Javascript 版本并不是每天都会发生的事情,并且标准的补充内容是众所周知的。

反对扩展本机原型是令人困惑的,因为我们的方法和本机方法之间没有区别。
pro JS 标准库很小并且文档齐全。我们 javascript 开发人员应该知道本机方法的名称。

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

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

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