javascript - 编写可重用的 javascript 模块和库。

标签 javascript jquery module functional-programming libraries

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

主要 react 是我的内容不能很好地与其他代码兼容。

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

那么用JS编写无冲突库的基本标准和工具是什么?


最佳答案

Javascript 是一种美丽而破烂的编程语言。许多来自其他语言的程序员经常发现它的本质相当令人困惑,如果不是非常烦人的话。

Javascript 缺少许多经典语言用来创建干净类和接口(interface)的工具。但这并不意味着你不能用 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());
 }

关于javascript - 编写可重用的 javascript 模块和库。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27116439/

相关文章:

javascript - ContainerView + LookupFactory 在 EmberJS 1.2.0+ 中不起作用

c# - MVC 模型绑定(bind)来自 jQuery post 的字符串数组

c++ - 如何使用宏动态加载 dll

oop - Perl6 : How to load a class module dynamically?

Android 应用程序包 : there was a problem while parsing the package (dynamic feature module only)

javascript - HTML5 : element <group>

javascript - 是否可以从内部 Promise 获取父函数的回调?

javascript - 替换超链接默认操作来加载ajax请求

javascript - 无法在 AngularJS 模板中循环数组

javascript - JQuery 只访问类中的第一项