这篇主要说一下在源码中jquery对象是怎样设计实现的,下面是相关代码的简化版本:

 (function( window, undefined ) {
// code 定义变量
jQuery = function( selector, context ) {
return new jQuery.fn.init( selector, context, rootjQuery );
},
// code 定义变量
jQuery.fn = jQuery.prototype = {
jquery: core_version,
constructor: jQuery,
init: function( selector, context, rootjQuery ) {
// code 初始化、参数处理
}
// code 一些方法(each、ready、first、eq等)
}
jQuery.fn.init.prototype = jQuery.fn;
// code 其他
if ( typeof window === "object" && typeof window.document === "object" ) {
window.jQuery = window.$ = jQuery;
}
})( window );

首先,回顾一下javascript中相关知识。

在javascript中特定类型的对象是通过构造函数来创建的,例如:

 function Person(name){
this.name = name;
this.sayName = function(){
alert(this.name);
}
}
// 作为普通函数使用
Person('Yanger90');
window.sayName(); // 作为构造函数使用
var person = new Person('Yanger90');
person.sayName();

更好的方式-原型模式

function Person(){}
Person.prototype = {
name: "Yanger90",
syaName: function(){
console.log(this.name);
}
};
var person = new Person();

每一个函数都有一个prototype(原型)属性,里面包含的属性和方法,是所有通过该构造函数创建的实例对象所共享的。对于一些公用的方法,像例子中的sayName方法,就可以放在原型中共享而不用像第一种方式那样,每个实例对象都要重新创建一遍。

好了,基础知识就简单介绍到这,详细可参阅《javascript高级程序设计》这本书。

回到jquery中,我们一般使用jquery语法类似这样:

$(element).css();

选择元素然后执行相应方法,那么前面的$(element)就应该是一个实例对象,再调用其方法。

我们看到在源码开始的部分就定义了jQuery变量:

jQuery = function( selector, context ) {
return new jQuery.fn.init( selector, context, rootjQuery );
}

它确实返回了一个实例对象,构造函数是init,接着往下看。

jQuery.fn = jQuery.prototype = {
jquery: core_version,
constructor: jQuery, // 修正以字面量方式重写原型对象造成的指向问题
init: function( selector, context, rootjQuery ) {
// code 初始化、参数处理
}
// code 一些方法(each、ready、first、eq等)
}

找到init发现它是jQuery原型(prototype)中的一个方法。

问题来了,init方法中只是对参数进行了处理,并没有我们常用的each、ready、first、eq等方法,它们都在jQuery原型(prototype)中,所以还无法调用这些方法,那么继续往后看。

jQuery.fn.init.prototype = jQuery.fn;

这句话把init的原型指向了jQuery.fn,也就是jQuery.prototype,这样一来,jQuery原型(prototype)中的属性和方法就共享给了通过init构造函数创建的实例对象,也就实现了继承。

最后,在jquery源码的末尾有一句

window.jQuery = window.$ = jQuery;

jQuery是在匿名函数中定义的,所以外部是无法访问的,这里将它赋值给window对象的属性,这样我们就可以在外部直接使用了。

Jquery源码中的Javascript基础知识(三)的更多相关文章

  1. Jquery源码中的Javascript基础知识(一)

    jquery源码中涉及了大量原生js中的知识和概念,文章是我在学习两者的过程中进行的整理和总结,有不对的地方欢迎大家指正. 本文使用的jq版本为2.0.3,附上压缩和未压缩版本地址: http://a ...

  2. Jquery源码中的Javascript基础知识(二)

    接上一篇,jquery源码的这种写法叫做匿名函数自执行 (function( window, undefined ) { // code })( window ); 函数定义了两个参数window和u ...

  3. Jquery源码中的Javascript基础知识(四)— jQuery.fn.init方法

    $() 即调用了jQuery.fn.init方法 jQuery = function( selector, context ) { return new jQuery.fn.init( selecto ...

  4. jquery源码中noConflict(防止$和jQuery的命名冲突)的实现原理

    jquery源码中noConflict(防止$和jQuery的命名冲突)的实现原理 最近在看jquery源码分析的视频教学,希望将视频中学到的知识用博客记录下来,更希望对有同样对jquery源码有困惑 ...

  5. jQuery源码中的“new jQuery.fn.init()”什么意思?

    所有文章搬运自我的个人主页:sheilasun.me 引子 最近打算试试看看jQuery的源码,刚开个头就卡住了.无论如何都理解不了jQuery源码入口部分中的 return new jQuery.f ...

  6. jQuery源码中的赌博网站

    前言 jQuery源码中有赌博网站? 起因是公司发的一份自查文件,某银行在日常安全运营过程中发现在部分jQuery源码中存在赌博和黄色网站链接. 链接分为好几个: www.cactussoft.cn ...

  7. 关于jQuery源码中(function(window,undefined){//dosomething()})(window)写法解释

    一.首先是最常见的闭包 (Closure) 范式自执行函数的写法,这里用匿名函数封装(构造块级作用域),避免了匿名函数内部的代码与外部之间发生冲突(如使用了相同的变量名). (function() { ...

  8. jQuery 源码中的 camelCase

    先看一下源码 //65-72行 // Matches dashed string for camelizing //匹配连字符 ‘-’ 和其后的第一个字母或数字,如果是字母,则替换为大写,如果是数字, ...

  9. 如何从源码中学习javascript

    艾伦说啊,学习javascript,必须要学会看源码,通过高手的源码,你可以从中吸取很多书本上难以看到的技巧. 看源码就好像喝鸡汤,所有的营养都在这汤里了.这汤就是源码,高手写的源码,就是最好的鸡汤. ...

随机推荐

  1. 导出含有图片的项目成jar文件后运行,图片不显示

    在编写完Java程序后,打包成Jar时发布,会发现找不到Jar文件中的图片和文本文件,其原因是程序中载入图片或文本文件时,使用了以当前工作路径为基准的方式来指定文件和路径.这与用户运行Jar包时的当前 ...

  2. POJ 1658

    #include<iostream>//cheng da cai zi using namespace std; int main() { int i; int time; ]; cin& ...

  3. Android中如何查看内存(上)

    文章参照自:http://stackoverflow.com/questions/2298208/how-to-discover-memory-usage-of-my-application-in-a ...

  4. Office 2013 note

    1.每次打开重新配置: 问题表现:启动后发现每次打开都会出现“正在配置”的进度 执行:reg add HKCU\Software\Microsoft\Office\15.0\Word\Options ...

  5. (9)nehe教程3--添加颜色

    添加颜色: 作为第二课的扩展,我将叫你如何使用颜色.你将理解两种着色模式,在左图中,三角形用的是光滑着色,四边形用的是平面着色. 上一课中我教给您三角形和四边形的绘制方法.这一课我将教您给三角形和四边 ...

  6. Windows SEH学习 x86

    windows 提供的异常处理机制实际上只是一个简单的框架.我们通常所用的异常处理(比如 C++ 的 throw.try.catch)都是编译器在系统提供的异常处理机制上进行加工了的增强版本.这里先抛 ...

  7. Spring学习总结(1)——Spring AOP的概念理解

    1.我所知道的aop 初看aop,上来就是一大堆术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充等等.一下子让你不知所措,心想着:怪不得 很多人都和我说aop多难多难 .当我看进去 ...

  8. java 基本数据类型 回顾

  9. 270. Closest Binary Search Tree Value

    题目: Given a non-empty binary search tree and a target value, find the value in the BST that is close ...

  10. android sqlite 怎么写入存储时间

    字符串类型2013-12-10 12:12:12 SimpleDateFormat formatter = new SimpleDateFormat ("yyyy-MM-dd"); ...