这篇文章的目的是通过演示一个简单的例子来介绍在JS中实例化和定义一个库的正确方法,以优化他人编写或维护自己的JS库。

在我们深入之前,我做了两点假设:

  • 你知道简单的JavaScript或C语言。
  • 你不打算使用jQuery。通常情况下,一个JavaScript库不需要任何依赖。

首先,我遇到了第一个麻烦,即如何正确的看待一个JavaScript库。在C/C++中,一个库是功能的集合,并且通常不需要很完美的结构。
而JavaScript的工作方式有所不同,因此我做了一些研究。最后的结论是,一个JavaScript库是一个包含在对象中的独立的模块,不会在自己的作用域以外定义函数来污染全局命名空间。

基于此,我们可以简单的定义一个库:

var Library = {
name: "Candy",
greet: function() {
alert("Hello from the " + Library.name + " library.");
}
}

这个库就是我们字面意思上所说的对象。调用greet函数,我们要用:

Library.greet();

因为greetLibrary对象的成员。现在,如果我们期望name变量为Library私有,应该怎么做呢?遗憾的是,这种库的定义方式无法实现这一点。

而且,不仅仅是在其他文件中要通过Library.name来引用name变量,在Library中也要通过引用自己来引用name变量。这种解决方式看起来就很差劲。

解决这个问题的方法是将Library定义为一个函数,在函数中定义对象。这种方式允许我们创建并使用私有的变量和方法。如下:

function Library() {
var name = "Candy";
this.greet = function() {
alert("Hello from the " + name + " library.");
}
}

在这种方式下,Library.name将不会暴露在全局,并且在Library内部也能被简单的引用。greet方法依然是公有的,因为通过关键字thisgreet定义为Library的一个成员。

确定将什么暴露给谁,是架构的简单实践。

但是,现在我们有了新的问题。在如下场景中,用户已经定义了一个Library对象,并且引用了你的库。

//用户自己的Library对象
var Library = {
book_num: 1123,
category: [
"science",
"social"
]
} //调用Library库中的方法
Library.greet();

这时,你的Library定义被覆盖,用户还将被告知“引用错误”。

我们有一个更好的解决方案:将你的library包装在一个函数中,这个函数将在不存在命名冲突时被调用。如下:

(function(window) {
'use strict';
function define_library() {
var Library = {};
var name = "Candy";
Library.greet = function() {
alert("Hello from the " + name + " library.");
}
return Library;
} if (typeof(Library) === "undefined") {
window.library = define_library();
} else {
console.log("Library is already defined.");
}
})(window);

首先,我们解释一下包装整个library的闭包:

(function(window) {
//CODE
})(window);

它的工作原理是,它包装了在它其中定义的代码,因此它拥有自己的命名空间。它也将会自动执行,因为末尾添加的(window)

接着,我们介绍一下使用的use strict。这是一个可选配置,可以在这里了解更多相关知识。由于我们整个定义是一个闭包,所以只需声明一次use strict,即可将严格模式应用于整个library

然后,我们在define_library()函数中定义了Library对象,并且在函数最后返回了该对象。

最后,我们通过typeof判断当前是否有命名冲突,如果没有,我们将初始化我们的Library对象。


要开始坚持写文章啦。这是最近看到的一篇国外文章,觉得对自己有点帮助,就翻译过来了,希望对大家也有所帮助,原文戳这里

接下来的一篇文章,将封装一个JS库,实现购物网站上常见的图片跟随鼠标放大的功能。

to be continued. 喜欢就关注我吧。

优雅的创建一个JavaScript库的更多相关文章

  1. 创建一个欢迎 cookie 利用用户在提示框中输入的数据创建一个 JavaScript Cookie,当该用户再次访问该页面时,根据 cookie 中的信息发出欢迎信息。

    创建一个欢迎 cookie 利用用户在提示框中输入的数据创建一个 JavaScript Cookie,当该用户再次访问该页面时,根据 cookie 中的信息发出欢迎信息. <html> & ...

  2. 创建你的第一个JavaScript库

    是否曾对Mootools的魔力感到惊奇?是否有想知道Dojo如何做到那样的?是否对jQuery感到好奇?在这个教程中,我们将了解它们背后的东西并且动手创建一个超级简单的你最喜欢的库. 我们其乎每天都在 ...

  3. 十二步创建你的第一个JavaScript库

    是否曾对Mootools的魔力感到惊奇?是否有想知道Dojo如何做到那样的?是否对jQuery感到好奇?在这个教程中,我们将了解它们背后的东西并且动手创建一个超级简单的你最喜欢的库. 我们其乎每天都在 ...

  4. 基于Grunt构建一个JavaScript库

    现在公认的JavaScript典型项目需要运行单元测试,合并压缩.有些还会使用代码生成器,代码样式检查或其他构建工具. Grunt.js是一个开源工具,可以帮助你完成上面的所有步骤.它非常容易扩展,并 ...

  5. iOS 在工程内部创建一个静态库target

    当你在开发项目的时候需要把公用的东西打包出来,其他项目方便使用的时候,打包成静态库是你的最优选择,在工程内部开发的时候新建一个target进行静态库的开发可以使你的开发调试更加方便而不是单独新建一个工 ...

  6. 创建一个版本库,把文件夹用Git管理起来

    创建一个文件夹,把这个文件夹用Git管理起来,那么这个文件夹的改变都可以被Git跟踪到,当然也可以将Git中的文件还原到某一个时刻. 首先创建一个空的目录,然后将空的目录由Git来管理 1.建立一个文 ...

  7. GIT使用—创建一个版本库

    一.GIT命令行 [root@localhost ~]# git usage: git [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path] ...

  8. 定义一个javascript库的兼容标准

    1. 定义一个库的兼容标准, 比如说是ie6+? 还是ie8+? 还是ie9.2. 原生知识储备,至少你不完整的读过一个库的代码.3. DOM操作和事件上的问题更多的是hack技巧,并不是算法,也不是 ...

  9. dragula 一个 JavaScript 库,实现了网页上的拖放位置

    如图,把上面红蓝色拖放到下面 使用方法比较简单,如下代码: <link href='dist/dragula.css' rel='stylesheet' type='text/css' /> ...

随机推荐

  1. 2018 ACM-ICPC 宁夏 C.Caesar Cipher(模拟)

    In cryptography, a Caesar cipher, also known as the shift cipher, is one of the most straightforward ...

  2. KMP匹配(模板)

    先粘上我入门KMP时看的大佬的博客:orz orz 从头到尾彻底理解KMP 我觉得这篇已经讲的很详细了,希望大家能坚持看下去. 步骤 ①寻找前缀后缀最长公共元素长度对于P = p0 p1 ...pj- ...

  3. 如何查看Linux系统下程序运行时使用的库?

    Linux系统下程序运行会实时的用到相关动态库,某些场景下,比如需要裁剪不必要的动态库时,就需要查看哪些动态库被用到了. 以运行VLC为例. VLC开始运行后,首先查看vlc的PID,比如这次查到的V ...

  4. python、anaconda、jupyter notebook、pycharm、spyder

    说明: 1.anaconda把任何东西都当做包来管理. 2.anaconda本省集成了python和conda.spyder.numpy等. 3.pip只用于python,conda可用于多种语言. ...

  5. 图表|Line graphs|Bar graphs|Pie graphs|Scatter graphs|标目|标值|图解|图题|标值|

    科研论文写作-图表 图像的特点是直观性高效,可用于描述非线性关系,将文字难以描述的内容表达出来. Line graphs中有自变量和因变量,用于表示变化趋势.为了清晰简洁和易于辨认,所以其中的线条最好 ...

  6. testNG报告优化,testNG-xslt

    一.在使用testNG自动化框架执行测试用例后,会自动生成HTML的测试报告,但是过于简单,信息展示极少,也没有图表说明,所有我们使用testNG-xslt进行美化. 二.具体实现步骤: 1.在网站下 ...

  7. vivado操作基本问题

    1.zynq开发板的构造以及推崇的设计理念 设计推崇的理念是设计有知识产权的可重用的IP模块. 2.操作过程中遇到的问题以及解决方法 (1)综合速度慢解决方案: 我们都知道Vivado编译起来相当的慢 ...

  8. mysql索引的面试题

    相信很多人对于MySQL的索引都不陌生,索引(Index)是帮助MySQL高效获取数据的数据结构. 因为索引是MySQL中比较重点的知识,相信很多人都有一定的了解,尤其是在面试中出现的频率特别高.楼主 ...

  9. SPA(单页面web应用)和MPA(多页面web应用)的区别

    转:https://blog.csdn.net/amaniz/article/details/79203562 vue多页面应用开发请参见: https://github.com/amunamuna/ ...

  10. 18.09.22模拟赛T2 历史

    网上基本上找不到这道题,何况LJJ还稍微改了一下...... 原题:传送门 题目描述 ljj 被S 国数不清的漂亮小姐姐所吸引,为了搞清楚为什么S 国有如此多的漂亮小姐姐,他决定研究S 国的历史. 根 ...