Jquery实现$.fn.extend和$.extend函数


Posted in Javascript onApril 14, 2016

前面我们扩展了bind方法和ready函数,这次我要讲一下$.fn.extend 和$.extend函数。

其他的不多说,直接切入主题吧!

先来看看这两个函数的区别:

  $.fn.extend是为查询的节点对象扩展方法,是基于$的原型扩展的方法

  $.extend是扩展常规方法,是$的静态方法。

我们之前写的代码看一下:

(function (win) {
      var _$ = function (selector, context) {
        return new _$.prototype.Init(selector, context);
      }
      _$.prototype = {
        Init: function (selector, context) {
  
        },
        each: function (callback) {
 
        }      
      }
      _$.prototype.Init.prototype = _$.prototype;       
      window.$ = window.JQuery = _$;
    })(window);

这个是主体的代码。

我来先来扩展$.fn.extend方法:

 这个方法的初衷是我们扩展之后可以用$("").newMetod()这样访问,实际上就是给$原型加一个extend方法。这中间的fn其实类似于命名空间的作用,没什么实际的意义。为的是和 $.extend作区分。

    熟悉原型的其实一看就知道:让$.fn指向$的原型不就行了?

于是我们就有了下面一段代码: _$.fn = _$.prototype;

接下来我们就来加上extend方法了:    

var isObj = function (o) {
      return Object.prototype.toString.call(o) === "[object Object]";
    }
    _$.fn.extend = function (obj) {
      if (isObj(obj)) {
        for (var i in obj) {
          this[i] = obj[i];
        }

      }
    }

 这段代码中isObj的作用是判断传入的参数是不是object对象, _$.fn.extend      这个方法其实和_$.prototype.extend 一样的,大家看一下,这个代码可能和JQUERY源码不太一样,我是按照自己的意思写的。

下面我们来实现$.extend方法,刚才已经说过了,这个方法其实是为$加一个静态方法,代码如下:

$.extend = function (obj) {
        if (isObj(obj)) {
          for (var i in obj) {
            this[i] = obj[i];
          }
        }
      }

  你会发现两个方法是一样的,不过你仔细琢磨一下,是不一样的:

  _$.fn.extend里面的this其实是代表$.prototype,  $.extend 里面的this代表的是$。

这两个方法我们实现了,奉上全部代码: 

(function (win) {
      var _$ = function (selector, context) {
        return new _$.prototype.Init(selector, context);
      }
      _$.prototype = {
        Init: function (selector, context) {

        },
        each: function (callback) {

        }
      }
      _$.prototype.Init.prototype = _$.prototype;
      _$.fn = _$.prototype;
      var isObj = function (o) {
        return Object.prototype.toString.call(o) === "[object Object]";
      }
      _$.fn.extend = function (obj) {
        if (isObj(obj)) {
          for (var i in obj) {
            this[i] = obj[i];
          }
        }
      }
      _$.extend = function (obj) {
        if (isObj(obj)) {
          for (var i in obj) {
            this[i] = obj[i];
          }
        }
      }
      window.$ = window.JQuery = _$;
    })(window);

使用方法其实就是

$.fn.extend(

{

   method:function(){

}

})

$.extend(

{

   method:function(){

}

})

代码和Jquery源码不一样,我这是为了简化写的方法,大家主要是要琢磨里面的思想,谢谢大家的阅读。

Javascript 相关文章推荐
一些经常会用到的Javascript检测函数
May 31 Javascript
js实现同一页面可多次调用的图片幻灯切换效果
Feb 28 Javascript
Javascript类型转换的规则实例解析
Feb 23 Javascript
jQuery获取attr()与prop()属性值的方法及区别介绍
Jul 06 Javascript
JS+DIV实现的卷帘效果示例
Mar 22 Javascript
jquery实现提示语淡入效果
May 05 jQuery
js图片加载效果实例代码(延迟加载+瀑布流加载)
May 12 Javascript
js,jq,css多方面实现简易下拉菜单功能
May 13 Javascript
JavaScript实现获取select下拉框中第一个值的方法
Feb 06 Javascript
JavaScript中字符串的常用操作方法及特殊字符
Mar 18 Javascript
利用Vue实现一个markdown编辑器实例代码
May 19 Javascript
JavaScript 实现HTML DOM增删改查操作的常见方法详解
Jan 04 Javascript
详解Jquery实现ready和bind事件
Apr 14 #Javascript
一起学写js Calender日历控件
Apr 14 #Javascript
jQuery获取父元素节点、子元素节点及兄弟元素节点的方法
Apr 14 #Javascript
原生js实现autocomplete插件
Apr 14 #Javascript
jQuery循环遍历子节点并获取值的方法
Apr 14 #Javascript
基于jQuery实现音乐播放试听列表
Apr 14 #Javascript
js仿3366小游戏选字游戏
Apr 14 #Javascript
You might like
德生1994机评
2021/03/02 无线电
PHP的autoload自动加载机制使用说明
2010/12/28 PHP
调整优化您的LAMP应用程序的5种简单方法
2011/06/26 PHP
PHP管理内存函数 memory_get_usage()使用介绍
2012/09/23 PHP
配置php网页显示各种语法错误
2013/09/23 PHP
Thinkphp微信公众号支付接口
2016/08/04 PHP
PHP网页安全认证的实例详解
2017/09/28 PHP
tp5框架基于ajax实现异步删除图片的方法示例
2020/02/10 PHP
javascript 写类方式之二
2009/07/05 Javascript
jquery isEmptyObject判断是否为空对象的函数
2011/02/14 Javascript
javascript 学习笔记(六)浏览器类型及版本信息检测代码
2011/04/08 Javascript
javascript获得服务器端控件的ID的实现代码
2011/12/28 Javascript
服务器端的JavaScript脚本 Node.js 使用入门
2012/03/07 Javascript
jquery实现像栅栏一样左右滑出式二级菜单效果代码
2015/08/24 Javascript
javascript巧用eval函数组装表单输入项为json对象的方法
2015/11/25 Javascript
实例讲解jquery与json的结合
2016/01/07 Javascript
浅谈Javascript中的函数、this以及原型
2016/10/09 Javascript
基于javascript实现的快速排序
2016/12/02 Javascript
深入探究node之Transform
2017/07/20 Javascript
解析vue data不可以使用箭头函数问题
2018/07/03 Javascript
小程序开发基础之view视图容器
2018/08/21 Javascript
Vue实现动态添加或者删除对象和对象数组的操作方法
2018/09/21 Javascript
Electron autoUpdater实现Windows安装包自动更新的方法
2018/12/24 Javascript
在vue中使用Base64转码的案例
2020/08/07 Javascript
Python字符串通过'+'和join函数拼接新字符串的性能测试比较
2019/03/05 Python
Python绘制全球疫情变化地图的实例代码
2020/04/20 Python
Anaconda3中的Jupyter notebook添加目录插件的实现
2020/05/18 Python
python获取时间戳的实现示例(10位和13位)
2020/09/23 Python
html5使用canvas实现图片下载功能的示例代码
2017/08/26 HTML / CSS
澳大利亚拥有最佳跳伞降落点和最好服务的跳伞项目运营商:Skydive Australia
2018/03/05 全球购物
LN-CC中国:高端男装和女装的奢侈时尚目的地
2019/09/14 全球购物
仓库管理专业个人自我评价范文
2013/11/11 职场文书
《悯农》教学反思
2014/04/28 职场文书
临时工聘用合同协议书
2014/10/29 职场文书
培训督导岗位职责
2015/04/10 职场文书
大型强子对撞机再次重启探索“第五种自然力”
2022/04/29 数码科技