jQuery选择这样返回对象

var jQuery = function( selector, context ) {
return new jQuery.fn.init( selector, context );//从jQuery.fn里调用的方法
};
jQuery.fn = jQuery.prototype = { //这里jQuery.prototype,目前在这段代码中没用 。
init: function(){
console.log("初始化完成");
return this;
}
  //功能方法
}
jQuery.fn.init.prototype = jQuery.fn //让所有实例化jQuery.fn.init都继承这个原型中的方法。
console.log(jQuery());//{...}

这里有一个重要的知识点,new 到底做了什么:new 构造函数jQuery.fn.init,将返回一个对象,这个对象会继承构造函数的原型jQuery.fn.init.prototype,而这个原型被我所们改写,指向jQuery.fn,也就是一个对象,对象里拥有init和所有的功能方法。这就实现了我们想返回一个拥有所有功能方法的对象。

我们也可以这样

var jquery = function(){
if(!(this instanceof jquery)) return new jquery();
console.log("初始化完成");
}
jquery.fn = jquery.prototype = {
//功能方法
}
console.log(jQuery());//{...}

其实,根本要解决的问题是返回一个对象,这个对象默认要拥有功能方法。为了最大效率,两个例子都选择不把功能方法写在对象里,而是通过对原型的改写,让实例化默认继承。

链式调用

var jQuery = function( selector, context ) {
return new jQuery.fn.init( selector, context );
};
jQuery.fn = jQuery.prototype = {
init: function(){
console.log("初始化完成");
return this;
},
add:function(){
console.log("add完成")
return this;
}
}
jQuery.fn.init.prototype = jQuery.fn
console.log(jQuery().add().add());

javascript中,函数中的this指向调用它的对象。本例,jQuery()实例化了一个对象,这个对象调用了add()方法,输出add,然后返回this,这个this实际就是调用它的对象jQuery(),因此无论执行了多少方法,只要返回this,那之前的结果都是最初的对象,都可以继续使用最初这个对象里功能方法。

向对象里添加方法的函数

var object = {
name: "winderby"
}
object.extend = function(obj){
for (var key in obj)
this[key] = obj[key];
return this;
}
object.extend({
getName:function(){
console.log(this.name);
}
})
object.getName();

合并对象

function extend() {
for (var i = 1; i < arguments.length;i++){
for(var key in arguments[i]){
arguments[0][key] = arguments[i][key]
}
}
}
var student = {
name:"winderby",
age: "18"
}
var arrangement = {
name:"winderby",
lesson:"english"
}
extend(student,arrangement);
console.log(student)

jQuery的extend

var jQuery = function( selector, context ) {
return new jQuery.fn.init( selector, context );
};
jQuery.fn = jQuery.prototype = {
init: function(){
return this;
}
}
jQuery.fn.init.prototype = jQuery.fn
jQuery.fn.extend = jQuery.extend = function(){//指向同一个方法
var i = 1;
var target = arguments[0];
var length = arguments.length;
if(length === 1){ //1个参数时
target = this;
i--;
}
for (; i < arguments.length;i++){ //主要功能体,遍历,赋值
for(var key in arguments[i]){
target[key] = arguments[i][key]
}
}
} //jQuery.extend合并对象测试
var student = {
name:"winderby",
age: "18"
}
var arrangement = {
name:"winderby",
lesson:"english"
}
jQuery.extend(student,arrangement);
console.log(student); //jQuery.fn.extend添加jQuery方法测试
jQuery.fn.extend({
setName: function(myName) {
this.myName = myName
return this;
},
getName: function() {
console.log(this.myName)
return this;
}
})
jQuery().setName("winderby").getName();

将前面两个功能合并到一个jQuery函数里就成了jQuery的extend。目前这个extend可以通过jQuery.extend合并对象,也可以通过jQuery.fn.extend,向jQuery.fn添加方法。

至于第三种用法jQuery(true,{..}),也很简单,就不赘述了。

jQuery源码笔记——二的更多相关文章

  1. jQuery源码笔记(二):定义了一些变量和函数 jQuery = function(){}

    笔记(二)也分为三部分: 一. 介绍: 注释说明:v2.0.3版本.Sizzle选择器.MIT软件许可注释中的#的信息索引.查询地址(英文版)匿名函数自执行:window参数及undefined参数意 ...

  2. jQuery源码笔记(一):jQuery的整体结构

    jQuery 是一个非常优秀的 JS 库,与 Prototype,YUI,Mootools 等众多的 Js 类库相比,它剑走偏锋,从 web 开发的实用角度出发,抛除了其它 Lib 中一些中看但不实用 ...

  3. 车大棒浅谈jQuery源码(二)

    前言 本来只是一个自己学习jQuery笔记的简单分享,没想到获得这么多人赏识.我自己也是傻呵呵的一脸迷茫,感觉到受宠若惊. 不过还是有人向批判我的文章说,这是基本知识点,完全跟jQuery源码沾不上边 ...

  4. jQuery 源码解析二:jQuery.fn.extend=jQuery.extend 方法探究

    终于动笔开始 jQuery 源码解析第二篇,写文章还真是有难度,要把自已懂的表述清楚,要让别人听懂真的不是一见易事. 在 jQuery 源码解析一:jQuery 类库整体架构设计解析 一文,大致描述了 ...

  5. jquery源码分析(二)——架构设计

    要学习一个库首先的理清它整体架构: 1.jQuery源码大致架构如下:(基于 jQuery 1.11 版本,共计8829行源码)(21,94)                定义了一些变量和函数jQu ...

  6. Tomcat8源码笔记(二)Bootstrap启动

    TOMCAT源码调试入口是Bootstrap类的main方法,我的启动参数VM: -Dcatalina.home=E:/Tomcat_Source_Code/apache-tomcat-8.0.53- ...

  7. jQuery 源码解析(二十五) DOM操作模块 html和text方法的区别

    html和text都可以获取和修改DOM节点里的内容,方法如下: html(value)     ;获取匹配元素集合中的一个元素的innerHTML内容,或者设置每个元素的innerHTML内容,   ...

  8. jQuery 源码解析(二十八) 样式操作模块 scrollLeft和scrollTop详解

    scrollLeft和scrollTop用于获取/设置滚动条的,如下: scrollLeft(val) ;读取或设置整个页面的水平滚动条距离 scrollTop(val) ;读取或设置整个页面的垂直滚 ...

  9. jQuery 源码解析(二十七) 样式操作模块 坐标详解

    样式操作模块可用于管理DOM元素的样式.坐标和尺寸,本节讲解一下坐标这一块. 对于坐标来说,jQuery提供了一个offset方法用于获取第一个匹配元素的坐标或者设置所有匹配元素的坐标,还有offse ...

随机推荐

  1. IT技术 | 让程序员抓狂的排序算法教学视频

    点击「箭头所指处」可快速关注传智特刊微信号:CZTEKAN 原文地址:http://mp.weixin.qq.com/s?__biz=MjM5OTM4NDMyMg==&mid=20056820 ...

  2. Android的读写文件权限

    设置文件生成的权限: public static boolean saveInfo( Context context, String userName, String userPass, int mo ...

  3. AJAX提交到Handler.ashx一般处理程序返回json数据 (字符串拼接方式)

    <%@ WebHandler Language="C#" Class="Handler" %> using System; using System ...

  4. 变形课(dfs)

    变形课 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Total Submissi ...

  5. 最新的Android SDK安装攻略(动作要快,来晚就失效了)

    Android的环境搭建好折腾,光是下载Android SDK就折腾了好几天, 直接连接,速度接近于0,一行行红色的refused, 然后找软件翻*墙成功(不推荐,软件可能有后门) 但是...速度比老 ...

  6. .NET系统架构改造的经验和教训

    转自: http://robbinfan.com/blog/43/rid-off-dotnet-experience 在互联网行业,基于Unix/Linux的网站系统架构毫无疑问是当今主流的架构解决方 ...

  7. UIPageViewController跳跃切换的问题

    使用的是XHScrollMenu和UIPageViewController来构建5个页面: ViewController1, ViewController2, ViewController3, Vie ...

  8. 图的邻接表存储 c实现

    图的邻接表存储 c实现 (转载) 用到的数据结构是 一个是顶点表,包括顶点和指向下一个邻接点的指针 一个是边表, 数据结构跟顶点不同,存储的是顶点的序号,和指向下一个的指针 刚开始的时候把顶点表初始化 ...

  9. DB2数据库常用基本操作命令

    点击开始菜单-->所有程序-->IBM-->DB2-->DB2COPY1-->命令行工具-->命令窗口一.DB2实例操作1.查看DB2数据库的版本及安装目录 E:\ ...

  10. (原)工具篇-利用fis压缩项目

    fis3 1.添加 fis-conf.js 到项目根目录中 fis-conf.js 内容如下 : //配置MD5版本控制 fis.match('*.{js,css,png,jpg}', { useHa ...