在工作中,我们使用 jQuery。在我们开始使用它后不久,我看到几个开发人员正在向文件 jquery-extensions.js 添加函数。在里面,我发现添加了一大堆方法$
这本质上相当于 jQuery 上的静态方法。这里有一些:
$.formatString(str, args) {
...
}
$.objectToArray(obj) {
...
}
Etc. 他们实际上都没有使用任何与 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() 函数。
我是唯一一个认为这种做法很愚蠢的人吗?
原生原型的争论有点累,双方都有有效的观点,我将尝试总结它们,希望对了解大局有所帮助。
contra无需扩展本机原型。你已经拥有了你需要的一切。
proJS标准库稀缺到了极点。数组和字符串缺乏许多重要的功能。
contra使用函数或您自己的“命名空间”。
pro方法如foo.trim()
比像这样的函数更符合语言的精神org.blah.trim(foo)
。 javascript 中一切都是对象,就这样吧。
contra原生 JS 对象是为语言设计者“保留”的。我们的方法可能会意外地覆盖新添加的内置函数。
pro开放对象是一个很棒的功能,不使用它就太愚蠢了。新的 Javascript 版本并不是每天都会发生的事情,并且标准的补充内容是众所周知的。
contra扩展本机原型很令人困惑,因为我们的方法和本机方法之间没有区别。
proJS 标准库很小并且文档齐全。我们 javascript 开发人员应该知道本机方法的名称。
contra扩展原型可能会导致命名空间冲突。
pro是的,但是全局函数或众所周知的全局对象(例如$
)也是如此。
contra自定义方法是可枚举的。
pro是的,但是有hasOwnProperty
来救援。将其包装在您自己的枚举器函数中并停止使用 rawfor..in
与对象循环。
(不是真正的答案,因此是 CW)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)