本文的目的是通过一个简单的例子来介绍在JS中实例化和定义库的正确方法,以优化别人编写或维护的JS库。在我们继续之前,我做了两个假设:您了解纯JavaScript或C。您不会使用jQuery。通常,JavaScript库不需要任何依赖项。首先遇到了第一个麻烦,就是如何正确对待一个JavaScript库。在C/C++中,库是功能的集合,通常不需要完美的结构化。JavaScript的工作方式不同,所以我做了一些研究。最后的结论是,JavaScript库是包含在对象中的自包含模块,不会通过在其自身范围之外定义函数来污染全局命名空间。基于此,我们可以简单地定义一个库:varLibrary={name:"Candy",greet:function(){alert("Hellofromthe"+Library.name+"library.");}}这个库就是我们字面意思的对象。要调用greet函数,我们使用:Library.greet();因为greet是Library对象的成员。现在,如果我们想让name变量对Library私有,我们应该怎么做?不幸的是,这对于库的定义方式是不可能的。而且,不仅在其他文件中通过Library.name来引用name变量,在Library中也可以通过引用自身来引用name变量。这个解决方案看起来很糟糕。解决这个问题的方法是将Library定义为函数,在函数中定义对象。这种方法允许我们创建和使用私有变量和方法。如下:functionLibrary(){varname="Candy";this.greet=function(){alert("你好来自"+name+"库。");这样,Library.name就不会暴露在全局,可以方便的在Library内部引用。greet方法仍然是公共的,因为greet被定义为带有this关键字的Library的成员。确定向谁公开什么是一种简单的架构实践。但是,现在我们遇到了一个新问题。在以下场景中,用户定义了一个库对象并引用了您的库。//用户自己的Library对象varLibrary={book_num:1123,category:["science","social"]}//调用Library库中的方法Library.greet();这时,你的Library定义被覆盖了,用户也会收到一个“引用错误”的通知。我们有一个更好的解决方案:将您的库包装在一个函数中,当没有命名冲突时,该函数将被调用。如下:(function(window){'usestrict';functiondefine_library(){varLibrary={};varname="Candy";Library.greet=function(){alert("Hellofromthe"+name+"library.");}returnLibrary;}if(typeof(Library)==="undefined"){window.library=define_library();}else{console.log("Libraryisalreadydefined.");}})(窗户);首先,让我们解释一下包装整个库的闭包:(function(window){//CODE})(window);它之所以有效,是因为它包装了其中定义的代码,因此它有自己的命名空间。因为最后加了(window),所以也会自动执行。接下来介绍usestrict的用法。这是一个可选配置,您可以在此处了解更多信息。由于我们整个定义都是一个闭包,所以我们只需要声明一次usestrict,就可以对整个库应用严格模式。然后,我们在define_library()函数中定义Library对象,并在函数结束时返回该对象。最后我们使用typeof来判断是否存在命名冲突。如果没有,我们将初始化我们的库对象。开始坚持写文章。这是最近看到的一篇国外文章。我觉得对我有帮助,所以我翻译了它。希望对大家有所帮助。点击此处查看原文。下篇文章会封装一个JS库,实现购物网站常见的图片鼠标放大功能。待续。喜欢就关注我吧。
