在core模块中,我们分析了实例化一个jQuery对象是由工厂方法jQuery交给了jQuery.fn.init。这个init实现是在init模块中完成的。

init模块最主要的任务还是实例化时传入的属性判断,具体实现还是交给另外的模块实现的。

比如:调用$(function(){})的时候,init判断是一个DOM ready函数,它就采用ready模块来实现。

再比如:调用$('<div></div>')的时候,因为判断字符串为一个html类型的,使用init模块会尝试去创建这个节点。这部分会依赖于parseHTML模块。

阅读全文

jQuery模块化的开端是jquery.js文件,在这个文件中详细的列出了jquery的模块。

一共有29个模块,其中有的是基础模块,像core别的模块都会依赖于它。
除了基础模块,别的模块都可以在自定义打包中决定是否需要。

打包之后的代码会被intro.jsoutro.js包围。形成如下代码的格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
(function(window,factory){
//检测是否支持模块
if (typeof module === "object" && typeof module.exports === "object") {
//检查是否模块环境中是否开启了window对象
//如果支持模块化的话采用模块化实例化工厂
//否则就用默认方式
module.exports = function( w ) {
w = w || window;
if ( !w.document ) {
throw new Error("jQuery需要一个包含document的window对象");
}
return factory( w );
};
} else {
factory( window );
}
}(this,function(window){
// 框架主体部分
}));

阅读全文

jQuery使用QUnit来测试javascript正确性,使用Benchmark来测试其选择元素的速度快慢。如果你不熟悉QUnit库参考我的一篇教程javascript单元测试Qunit

我并没沿用jQuery的Qunit测试,我为了更方便的研究,在测试中集成了requirejs。

测试目录文件如下:

1
2
3
4
test/ -- 测试目录
├── data/ -- 测试辅助相关数据目录
├── unit/ -- 单元测试目录
└── index.html -- 默认页面

阅读全文

jQuery在编写中采用了AMD模块的方式,使用的是requirejs框架。

模块开发带来的益处很多,特别对于我们来说源码的阅读更加方便明了。

Jquery主页结构

1
2
3
4
5
6
7
8
9
jquery/ -- 项目主目录
├── bower_components/ -- bower依赖目录
├── build/ -- 自定义任务目录
├── dist/ -- 发布目录
├── node_modules/ -- grunt 插件 录
├── src/ -- 源码目录
├── test/ -- 单元测试目录
├── speed/ -- 速度测试目录
└── Gruntfile.coffee -- grunt配置文件
阅读全文

你可能知道JavaScript不是一个完全基于OOP的语言。当然也有一些方法来处理这个问题,你仍然可以创建类和继承它们。
使用类可以很好的帮助你拆分模块和创建更优秀的程序结构。

下面是最普通的基于构造函数的创建类:

1
2
3
var Animal = function() {
this.name = "animal";
}
阅读全文

当我第一次开始学习JavaScript对象模型,我的感觉就是好深奥啊,好难懂啊。我完全不解其prototype的性质,因为javascript是我第一次遇到的一个基于原型的语言。我不知道JavaScript有一个独特的prototype的作用,构造函数的概念。我相信,许多人都有过类似的经验。

在开发中,javascript使用是非常频繁的,只是简单的学习远远达不到理解的目的,必须渐渐深入它,也行你也会像我一样突然发现自己喜欢上了这样的方式。JavaScript是一门优雅和灵活性的原型语言。基于原型的语言有着更简单,更灵活的对象模型。

原型

在javascript中每个对象都有一个prototype,实例化的javascript对象都有一个proto,如下面代码:

1
2
3
4
5
6
var Person = function(){};
var person1 = new Person();
var person2 = new Person();
console.log(Person.prototype);//object
console.log(person1.__proto__);//object 注:有的浏览器不支持直接读取内部原型。
console.log(person2.__proto__);//object
阅读全文

QUnit是用来测试javascript真确性的,是一个简单强大的单元测试框架。如果你已经熟悉javascript,那么上手QUnit的难度几乎为0。

QUnit编写测试非常的简简明了。

测试函数:

1
2
3
test('测试名称', function() {
// 代码
});

阅读全文

我经常听到很多地方和教程中说,每当重写equals()方法,我需要重写hashCode()方法。但是,原因是什么?

equals()是定义在Object的一个方。在Java中,有两种类型的比较。一种方法是使用 “==” 操作符,
另一种就是“equals()” 。这两者之间的差异相信大家都知道, “equals()”是指等价关系。
在广义上说两个对象是相等的,他们满足的是“equals()”条件。

hashCode()是定义在Object的一个native方法,默认实现基本上是对象提供来自内存地址映射到一个整数的值。

阅读全文

Javy Liu

author.bio


author.job


beijing