javascript – 本机原型vs $.extension()

前端之家收集整理的这篇文章主要介绍了javascript – 本机原型vs $.extension()前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在工作中,我们使用jQuery.在我们开始使用它之后不久,我看到一些开发人员正在向文件 jquery-extensions.js添加功能.在里面,我发现一大堆方法添加到$,基本上是jQuery的静态方法.这里有几个:
$.formatString(str,args) {
    ...
}

$.objectToArray(obj) {
    ...
}

等等,他们实际上并没有使用jQuery做任何事情.这让我感到奇怪.

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

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

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

不久之后,我得到一名高级开发人员来问我,我想我在做什么.他告诉我,在这里,我在哪里工作,我们不会创造原型,因为它们是邪恶的.他所提供的唯一原因是他们从根本上讲是一种糟糕的语言特征,因为它们可以被滥用,并且看到原型令人困惑(例如我如何知道新的Date().LocaleDate()是一个原型而不是本机的ECMAScript ).通过使用$.formatString(…)而不是“blah blah”.formatString(…),我们保持清楚,任何带有$的东西都不是本机JavaScript的一部分.

这些原因似乎有点愚蠢,但是我提出了妥协,所以他不必记住一个方法是一个原型前缀的原型函数名称与$:

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

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

这很快被解雇了,现在我不得不在任何地方添加这些$.myPrototypeAsAFauxStaticMethodOnjQuery()函数.

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

解决方法

原生的原型辩论有点累,双方都有有效的点,我会尽量总结一下,希望看到大局可能是有用的.

对比没有必要扩展原生的原型.你有你需要的一切
亲JS标准库极其稀​​缺.数组和字符串缺乏许多重要特征.

使用功能或您自己的“命名空间”.
pro像foo.trim()这样的方法比org.blah.trim(foo)等函数更符合语言的精神.一切都是javascript中的对象,让它成为一种方式.

对等本地JS对象是为语言设计者“保留”的.我们的方法可能会意外覆盖新增的内置功能.
pro打开对象是一个很大的功能,它将是愚蠢的不使用它.一个新的Javascript版本不是每天发生的事情,标准的增加是提前知道的.

对比扩展原生原型是令人困惑的,因为我们和本地方法之间没有区别.
pro JS标准库很小,文档很好.我们JavaScript开发人员应该知道本机方法名称.

扩展原型可能导致命名空间冲突.
亲是的,但这可能发生在全球功能或众所周知的全球对象(如$)上.

自定义方法是可列举的.
亲是的,但是有一个呵呵的ProProtyty.将其包装在您自己的枚举器函数中,并停止使用带有对象的raw for..in循环.

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

猜你在找的JavaScript相关文章