Javascript 是一门美丽而破碎的编程语言。许多来自其他语言的程序员经常发现它的性质非常令人困惑,如果不是很烦人的话。
Javascript 缺少许多经典语言用来创建干净的类和接口的工具。但这并不意味着你不能用 JS 编写出色的库,它只是意味着你需要学习如何使用它提供的工具。
IMO 关于良好模块化代码的最佳资源是:
在所有这些中,冲突代码的问题通过至少以下两种做法得到解决。
IFFE 包装器
(function(dependency , undefined ) {
...dostuff...
})(dependency)
将您的库包装在IFFE 中非常有用,因为它会立即生成closure。这可以防止您过度填充全局命名空间。
另外:上面的代码将库dependencies作为参数传入。这既提高了性能,又减少了副作用。例如jQuery通过:(function(window){})(window)窗口传入
最后但同样重要的是,我们添加但不定义参数undefined。这通常被称为白痴测试。如果有人在他们的代码中的其他地方更改了undefined,它很容易给你的库带来各种麻烦。 (function(undefined) {})()通过“未定义 undefined”修复此问题,从而使其按预期工作。
冲突处理程序
var _myLibrary = window.myLibrary;//Backs up whatever myLibrary's old value was
myLibrary = function(){...dostuff...};
myLibrary.prototype = {
getConflict : function() {
return window.myLibrary === myLibrary ?
_myLibrary || false : false;
};
}
当您不知道您的其他库将与哪些库一起使用时,冲突方法非常重要。上面的方法类似于jQuery的'noConflict'。
简而言之,getConflict 返回被覆盖的 myLibrary 变量。如果没有任何内容被覆盖,则返回 false。
让它返回 false 非常有用,因为它可以像这样在 if 语句中使用。
if(myLibrary.getConflict()){
var foo = Object.create(myLibrary.getConflict());
}