优雅的创建一个JavaScript库
这篇文章的目的是通过演示一个简单的例子来介绍在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();
因为greet
是Library
对象的成员。现在,如果我们期望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
方法依然是公有的,因为通过关键字this
将greet
定义为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库的更多相关文章
- 创建一个欢迎 cookie 利用用户在提示框中输入的数据创建一个 JavaScript Cookie,当该用户再次访问该页面时,根据 cookie 中的信息发出欢迎信息。
创建一个欢迎 cookie 利用用户在提示框中输入的数据创建一个 JavaScript Cookie,当该用户再次访问该页面时,根据 cookie 中的信息发出欢迎信息. <html> & ...
- 创建你的第一个JavaScript库
是否曾对Mootools的魔力感到惊奇?是否有想知道Dojo如何做到那样的?是否对jQuery感到好奇?在这个教程中,我们将了解它们背后的东西并且动手创建一个超级简单的你最喜欢的库. 我们其乎每天都在 ...
- 十二步创建你的第一个JavaScript库
是否曾对Mootools的魔力感到惊奇?是否有想知道Dojo如何做到那样的?是否对jQuery感到好奇?在这个教程中,我们将了解它们背后的东西并且动手创建一个超级简单的你最喜欢的库. 我们其乎每天都在 ...
- 基于Grunt构建一个JavaScript库
现在公认的JavaScript典型项目需要运行单元测试,合并压缩.有些还会使用代码生成器,代码样式检查或其他构建工具. Grunt.js是一个开源工具,可以帮助你完成上面的所有步骤.它非常容易扩展,并 ...
- iOS 在工程内部创建一个静态库target
当你在开发项目的时候需要把公用的东西打包出来,其他项目方便使用的时候,打包成静态库是你的最优选择,在工程内部开发的时候新建一个target进行静态库的开发可以使你的开发调试更加方便而不是单独新建一个工 ...
- 创建一个版本库,把文件夹用Git管理起来
创建一个文件夹,把这个文件夹用Git管理起来,那么这个文件夹的改变都可以被Git跟踪到,当然也可以将Git中的文件还原到某一个时刻. 首先创建一个空的目录,然后将空的目录由Git来管理 1.建立一个文 ...
- GIT使用—创建一个版本库
一.GIT命令行 [root@localhost ~]# git usage: git [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path] ...
- 定义一个javascript库的兼容标准
1. 定义一个库的兼容标准, 比如说是ie6+? 还是ie8+? 还是ie9.2. 原生知识储备,至少你不完整的读过一个库的代码.3. DOM操作和事件上的问题更多的是hack技巧,并不是算法,也不是 ...
- dragula 一个 JavaScript 库,实现了网页上的拖放位置
如图,把上面红蓝色拖放到下面 使用方法比较简单,如下代码: <link href='dist/dragula.css' rel='stylesheet' type='text/css' /> ...
随机推荐
- jenkins_2
1.jenkins pipline:一些列jenkins插件将整个CD(持续交付过程)用解释性代码Jenkinsfile来描述(之前的都是通过配置设置的,这次是通过file) 2.创建一个流水线任务 ...
- 让Spring不再难懂-aop篇
什么是aop AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP允许 ...
- linux清除cache的方法
1 Linux下内存占用多的原因 当linux第一次读取一个文件运行时,一份放到一片内存中cache起来,另一份放入运行程序的内存中,正常运行,当程序运行完,关闭了,cache中的那一分却没有释放, ...
- C#函数的基础应用
C#函数的基础应用 函数之前的知识回顾 数据类型--变量常量--运算符表达式--语句(顺序,分支,循环)--数组--函数 程序里的函数:能完成一个相对独立功能的代码模块. 数学里的函数:高度抽象. 函 ...
- 用dfs序处理线段树的好题吗?
https://www.cnblogs.com/mountaink/p/9878918.html 分析:每次的选取必须选最优的一条链,那我们考虑一下选择这条链后,把这条路上的点的权值更新掉,再采取选最 ...
- python语法基础-函数-内置函数和匿名函数-长期维护
################## 内置函数 ####################### """ 一共是 68个内置函数: 反射相关的内置函 ...
- 关于AI行业创业的6个问题
第一个问题:互联网 vs 人工智能 首先如果今天大家选择创业,我建议更应该关注人工智能,而非互联网.为什么这么讲? 1. 互联网的流量红利已经消失: 以PC来说,全球PC出货量连续5年下滑.大家知道国 ...
- python初认函数
今日所得 函数基本使用 函数的参数 函数的返回值 # 函数内要想返回给调用者值 必须用关键字return """ 不写return 只写return 写return No ...
- 使用JavaScript获取前一周的日期
在开发当中遇到了一个关于echarts初始展示当前前7天的数据,正好记录一下如何获取前"n"天的日期, 返回时间格式:2020-02-02 // 返回前number天的日期格式为2 ...
- Linux和git使用
一.Linux cd . .. - ~ ls -a h l 通配符 mkdir bouch nano vim cat clear cp -r ./db/ ./lib/ mv -r rm -r wh ...