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 插件开发方法小结
Oct 23 Javascript
基于Jquery 解决Ajax请求的页面 浏览器后退前进功能,页面刷新功能实效问题
Dec 11 Javascript
JS获取屏幕,浏览器窗口大小,网页高度宽度(实现代码)
Dec 17 Javascript
javascript获取浏览器类型和版本的方法(js获取浏览器版本)
Mar 13 Javascript
gridview生成时如何去掉style属性中的border-collapse
Sep 30 Javascript
jQuery中:enabled选择器用法实例
Jan 04 Javascript
JavaScript中的Math.sin()方法使用详解
Jun 15 Javascript
asp.net+jquery.form实现图片异步上传的方法(附jquery.form.js下载)
May 05 Javascript
JavaScript基础重点(必看)
Jul 09 Javascript
一个简单的JavaScript Map实例(分享)
Aug 03 Javascript
Angularjs上传文件组件flowjs功能
Aug 07 Javascript
解决vue 子组件修改父组件传来的props值报错问题
Nov 09 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
15个小时----从修改程序到自己些程序
2006/10/09 PHP
typecho插件编写教程(五):核心代码
2015/05/28 PHP
PHP随手笔记整理之PHP脚本和JAVA连接mysql数据库
2015/11/25 PHP
Windows下PHP开发环境搭建教程(Apache+PHP+MySQL)
2016/06/13 PHP
PHP使用curl制作简易百度搜索
2016/11/03 PHP
php-fpm中max_children的配置
2019/03/15 PHP
laravel实现前后台路由分离的方法
2019/10/13 PHP
层序遍历在ExtJs的TreePanel中的应用
2009/10/16 Javascript
几个比较实用的JavaScript 测试及效验工具
2010/04/18 Javascript
JQquery的一些使用心得分享
2012/08/01 Javascript
JS仿Windows开机启动Loading进度条的方法
2015/02/26 Javascript
JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
2016/05/16 Javascript
Javascript之Number对象介绍
2016/06/07 Javascript
[js高手之路]原型式继承与寄生式继承详解
2017/08/28 Javascript
JS获取字符对应的ASCII码实例
2017/09/10 Javascript
AngualrJs清除定时器遇到的坑
2017/10/13 Javascript
bootstrap Table服务端处理分页(后台是.net)
2017/10/19 Javascript
解决Mac下安装nmp的淘宝镜像失败问题
2018/05/16 Javascript
vue中eslintrc.js配置最详细介绍
2018/12/21 Javascript
页面内锚点定位及跳转方法总结(推荐)
2019/04/24 Javascript
jquery.tagsinput.js实现记录checkbox勾选的顺序
2019/09/21 jQuery
vue 路由meta 设置导航隐藏与显示功能的示例代码
2020/09/04 Javascript
跟老齐学Python之大话题小函数(1)
2014/10/10 Python
在Linux上安装Python的Flask框架和创建第一个app实例的教程
2015/03/30 Python
基于python元祖与字典与集合的粗浅认识
2017/08/23 Python
python实现windows下文件备份脚本
2018/05/27 Python
pandas 实现字典转换成DataFrame的方法
2018/07/04 Python
Python matplotlib的使用并自定义colormap的方法
2018/12/13 Python
Python3实现获取图片文字里中文的方法分析
2018/12/13 Python
Python实现的排列组合、破解密码算法示例
2019/04/12 Python
Python生成rsa密钥对操作示例
2019/04/26 Python
Django接收post前端返回的json格式数据代码实现
2019/07/31 Python
Python如何在bool函数中取值
2020/09/21 Python
捷克家具销售网站:SCONTO Nábytek
2020/01/02 全球购物
2014年巴西世界杯口号
2014/06/05 职场文书
夫妻分居协议书范文
2014/11/26 职场文书