【问题标题】:Writing reusable javascript modules & libraries.编写可重用的 JavaScript 模块和库。
【发布时间】:2015-01-22 20:24:07
【问题描述】:

我使用 javascript 已经有一段时间了,并且创作了我的第一个内容,这些内容已被其他人使用。

主要反应是我的内容不能很好地与其他代码配合使用。

不幸的是,javascript 没有很多用于创建非冲突库的常规工具,如命名空间和类

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


【问题讨论】:

    标签: javascript jquery module functional-programming libraries


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2017-06-04
      • 1970-01-01
      • 2011-03-16
      • 2011-02-06
      • 1970-01-01
      • 2019-08-21
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多