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 相关文章推荐
jQuery调用WebService的实现代码
Jun 19 Javascript
jquery获取div宽度的实现思路与代码
Jan 13 Javascript
jquery 追加tr和删除tr示例代码
Sep 12 Javascript
jQuery中:visible选择器用法实例
Dec 30 Javascript
js实现完全自定义可带多级目录的网页鼠标右键菜单方法
Feb 28 Javascript
JavaScript淡入淡出渐变简单实例
Aug 06 Javascript
基于jQuery实现Ajax验证用户名是否存在实例
Mar 30 Javascript
AngularJS指令中的绑定策略实例分析
Dec 14 Javascript
Ionic2开发环境搭建教程
Aug 20 Javascript
深入理解移动前端开发之viewport
Oct 19 Javascript
JS二级菜单不同实现方法分析【4种方法】
Dec 21 Javascript
使用Ajax实现无刷新上传文件
Apr 12 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
PHP基础陷阱题(变量赋值)
2012/09/12 PHP
PHP页面中文乱码分析
2013/10/29 PHP
php生成缩略图填充白边(等比缩略图方案)
2013/12/25 PHP
浅谈PHP中其他类型转化为Bool类型
2016/03/28 PHP
Laravel框架实现redis集群的方法分析
2017/09/14 PHP
输入框的字数时时统计—关于 onpropertychange 和 oninput 使用
2011/10/21 Javascript
用js来获取上传的文件名纯粹是为了美化而用
2013/10/23 Javascript
js中split函数的使用方法说明
2013/12/26 Javascript
setTimeout自动触发一个js的方法
2014/01/15 Javascript
JavaScript数组Array对象增加和删除元素方法总结
2015/01/20 Javascript
有关JS中的0,null,undefined,[],{},'''''''',false之间的关系
2017/02/14 Javascript
Vue.js 中的 $watch使用方法
2017/05/25 Javascript
Bootstrap Table使用整理(五)之分页组合查询
2017/06/09 Javascript
讲解vue-router之什么是编程式路由
2018/05/28 Javascript
原生js+css调节音量滑块
2020/01/15 Javascript
[49:31]TFT vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
使用Python3 编写简单信用卡管理程序
2016/12/21 Python
python、java等哪一门编程语言适合人工智能?
2017/11/13 Python
Python+matplotlib实现计算两个信号的交叉谱密度实例
2018/01/08 Python
Python实现字符串的逆序 C++字符串逆序算法
2020/05/28 Python
python多线程之事件Event的使用详解
2018/04/27 Python
Django学习教程之静态文件的调用详解
2018/05/08 Python
python re模块的高级用法详解
2018/06/06 Python
使用Python画股票的K线图的方法步骤
2019/06/28 Python
解决os.path.isdir() 判断文件夹却返回false的问题
2019/11/29 Python
使用CSS3来代替JS实现交互
2017/08/10 HTML / CSS
英国最大的电脑零售连锁店集团:PC World
2016/10/10 全球购物
阿联酋彩妆品牌:OUD MILANO
2019/10/06 全球购物
英国独特家具和家庭用品购物网站:Cuckooland
2020/08/30 全球购物
护士实习自我鉴定
2013/10/22 职场文书
应届毕业生自我鉴定范文
2013/12/27 职场文书
国家助学金感谢信
2015/01/21 职场文书
2016春节放假通知范文
2015/08/18 职场文书
PHP判断是否是json字符串
2021/04/01 PHP
Java方法重载和方法重写的区别到底在哪?
2021/06/11 Java/Android
JavaScript高级程序设计之变量与作用域
2021/11/17 Javascript