最近,我一直在构建一些JavaScript库以及一些jQuery插件,并且我有一个'utils.js'文件,其中我放置了Array
, String
, Number
等的所有自定义函数,并将其包含在库或插件的最终缩小版本中。
像这样:
String.prototype.custom_method = function() {
// Do custom stuff
};
Array.prototype.custom_method = function() {
// Do custom stuff
};
所以,这些是我的问题:
- 我必须避免这个吗?这种做法不好吗?
- 如果我把这些方法在每个库/插件范围会更好吗?
考虑到jQuery和Modernizr做完全相同的事情(提供很多开箱即用的能力,而普通人仍然只使用10%),我不认为有什么问题。
肿胀吗?也许。最理想的是只包含你使用的文件(谷歌插件的一个伟大之处在于,包含你需要的东西),但是我没有看到比已经存在的更大的威胁。
我认为你划分它们是朝着正确方向迈出的一步,因为多个库可能需要它们(没有重复的声明)。但是,如果你真的担心它,你可以做一个test-declare setup:
if (typeof foo === 'undefined'){
function foo(){}
}
但是再一次,它需要包含在你发布/构建的每个库中,而不是一个"包涵一切"的库。
对你的问题进行了很好的讨论。
http://perfectionkills.com/extending-built-in-native-objects-evil-or-not/简短的回答:扩展本机类型,不是很好,但是可以。像.js那样包装它们会更好,因为这样以后就不可能发生冲突了。
这取决于观众。如果将方法添加或覆盖到默认类中,将永远无法赢得企业用户的支持。谁知道这会引起什么冲突呢?看一看underscore.js http://documentcloud.github.com/underscore/,这个库努力避免用装饰器方法做这种事。这对于拥有代码库的用户来说要友好得多,这些代码库除了您的代码外,天知道还包括什么。
但是,如果您的代码确实可以在筒仓中自行运行,那么就使用它。