编写可重用的javascript模块&库。

时间:2014-11-24 23:56:42

标签: javascript jquery module functional-programming libraries

我一直在使用javascript,并撰写了我的第一个已被其他人使用过的内容。

主要的反应是我的内容与其他代码不相符。

不幸的是,javascript没有很多用于创建非冲突库的常规工具,就像名称空间和类一样。

那么在JS中编写非冲突库的基本标准和工具是什么?


1 个答案:

答案 0 :(得分:4)

Javascript是一种美观且破碎的编程语言。许多来自其他语言的程序员经常发现它的性质非常令人困惑,如果不是令人讨厌的话。

Javascript缺少很多古典语言用来创建干净的类和接口的工具。但这并不意味着您无法在JS中编写出色的库,只是意味着您需要学习如何使用它提供的工具。

IMO关于良好模块化代码主题的最佳资源是:

在所有这些问题中,代码冲突的问题通过至少以下两种做法来解决。


IFFE Wrapper

(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());
 }