jQuery选择这样返回对象

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

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

我们也可以这样

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

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

链式调用

  1. var jQuery = function( selector, context ) {
  2. return new jQuery.fn.init( selector, context );
  3. };
  4. jQuery.fn = jQuery.prototype = {
  5. init: function(){
  6. console.log("初始化完成");
  7. return this;
  8. },
  9. add:function(){
  10. console.log("add完成")
  11. return this;
  12. }
  13. }
  14. jQuery.fn.init.prototype = jQuery.fn
  15. console.log(jQuery().add().add());

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

向对象里添加方法的函数

  1. var object = {
  2. name: "winderby"
  3. }
  4. object.extend = function(obj){
  5. for (var key in obj)
  6. this[key] = obj[key];
  7. return this;
  8. }
  9. object.extend({
  10. getName:function(){
  11. console.log(this.name);
  12. }
  13. })
  14. object.getName();

合并对象

  1. function extend() {
  2. for (var i = 1; i < arguments.length;i++){
  3. for(var key in arguments[i]){
  4. arguments[0][key] = arguments[i][key]
  5. }
  6. }
  7. }
  8. var student = {
  9. name:"winderby",
  10. age: "18"
  11. }
  12. var arrangement = {
  13. name:"winderby",
  14. lesson:"english"
  15. }
  16. extend(student,arrangement);
  17. console.log(student)

jQuery的extend

  1. var jQuery = function( selector, context ) {
  2. return new jQuery.fn.init( selector, context );
  3. };
  4. jQuery.fn = jQuery.prototype = {
  5. init: function(){
  6. return this;
  7. }
  8. }
  9. jQuery.fn.init.prototype = jQuery.fn
  10. jQuery.fn.extend = jQuery.extend = function(){//指向同一个方法
  11. var i = 1;
  12. var target = arguments[0];
  13. var length = arguments.length;
  14. if(length === 1){ //1个参数时
  15. target = this;
  16. i--;
  17. }
  18. for (; i < arguments.length;i++){ //主要功能体,遍历,赋值
  19. for(var key in arguments[i]){
  20. target[key] = arguments[i][key]
  21. }
  22. }
  23. }
  24.  
  25. //jQuery.extend合并对象测试
  26. var student = {
  27. name:"winderby",
  28. age: "18"
  29. }
  30. var arrangement = {
  31. name:"winderby",
  32. lesson:"english"
  33. }
  34. jQuery.extend(student,arrangement);
  35. console.log(student);
  36.  
  37. //jQuery.fn.extend添加jQuery方法测试
  38. jQuery.fn.extend({
  39. setName: function(myName) {
  40. this.myName = myName
  41. return this;
  42. },
  43. getName: function() {
  44. console.log(this.myName)
  45. return this;
  46. }
  47. })
  48. 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. C与C++动态分配二维数组

    C: C中使用函数malloc和free两个函数. //动态分配M*N维 int **a=(int **)malloc(sizeof(int*)*M); ;i<M;i++) a[i]=(int ...

  2. Uber上海公司被司机打上门

    “Uber上周的工资没有到账,司机们都急了.”9月13日,<IT时报>记者接到Uber司机爆料,称Uber(优步)拖欠工资,客服给的解释是银行系统对接问题,但多名司机赶往Uber上海公司咨 ...

  3. SQL SERVER分区视图

    借助SQL SERVER分区视图,可以对SQL中的表进行集中管理,下文将以实例的方式为您详解SQL SERVER分区视图,希望对您学习SQL数据库能有所帮助. SQL SERVER分区视图给我们提供了 ...

  4. Swift类与结构、存储属性、计算属性、函数与方法、附属脚本等

    写了12个Person来复习,不过完成同样的代码需要敲键盘的次数相比OC确实少了很多,这很多应该归功于Swift中不写分号,以及少了OC中的中括号. 一.类与结构体 两者在Swift中差不了多少了 类 ...

  5. nyoj 523 亡命逃窜 【BFS】

    亡命逃窜 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描写叙述 从前有个叫hck的骑士,为了救我们漂亮的公主,潜入魔王的老巢,够英雄吧.只是英雄不是这么好当的.这个可怜的娃 ...

  6. Unity 利用NGUI2.6.3做技能冷却的CD效果

    NGUI非常强大我们今天来学习一下,如何利用NGUI做技能冷却的CD效果.先导入NGUI的插件.没有的话这里有啊NGUI2.6.3下载地址: http://vdisk.weibo.com/s/KLqn ...

  7. ToString()的浅显解释(转)

    转自:http://zhidao.baidu.com/link?url=2g3NZ8tmL635L5XmWUh5i-mAlAsySunJryiq2Jl0LRsM691049dOwhoXy-8kJ6HL ...

  8. HTML4如何让一个DIV居中对齐?float输入日志标题

    float:left,right clear:both 如何让一个DIV居中对齐? 第一步:设置外层的DIV的text-align:center; 第二步:设置里层的DIV的margin:auto 以 ...

  9. 图的最短路径问题————树上奶牛(tree.cpp)

    和往常一样,继续从题目引入 树上奶牛 (tree.cpp) [题目描述] 农夫John的奶牛不是住在地上而是住在树上的QWQ. 奶牛之间需要串门,不过在串门之前他们会向John询问距离的大小.可是Jo ...

  10. TCP/IP详解之:UDP协议

    第11章 UDP协议  UDP首部 UDP的检验和是可选的,而TCP的检验和是必须的: UDP的检验和是端到端的检验和.由发送端计算,由接收端验证: 尽管UDP的检验和是可选的,但总是推荐被使用 IP ...