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中null与undefined分析
Jul 25 Javascript
jQuery去掉字符串起始和结尾的空格(多种方法实现)
Apr 01 Javascript
jQuery解析XML文件同时动态增加js文件的方法
Jun 01 Javascript
深入理解JS函数的参数(arguments)的使用
May 28 Javascript
jquery 标签 隔若干行加空白或者加虚线的方法
Dec 07 Javascript
纯jQuery实现前端分页功能
Mar 23 jQuery
javascript实现延时显示提示框效果
Jun 01 Javascript
vue2 前端搜索实现示例
Feb 26 Javascript
VUE实现可随意拖动的弹窗组件
Sep 25 Javascript
js字符串倒序的实例代码
Nov 30 Javascript
JS实现的进制转换,浮点数相加,数字判断操作示例
Nov 09 Javascript
小程序自定义轮播图圆点组件
Jun 25 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运行环境配置与开发环境的配置(图文教程)
2013/06/04 PHP
解决laravel groupBy 对查询结果进行分组出现的问题
2019/10/09 PHP
jquery如何判断某元素是否具备指定的样式
2013/11/05 Javascript
node.js WEB开发中图片验证码的实现方法
2014/06/03 Javascript
gridview生成时如何去掉style属性中的border-collapse
2014/09/30 Javascript
JS在可编辑的div中的光标位置插入内容的方法
2014/11/20 Javascript
5种处理js跨域问题方法汇总
2014/12/04 Javascript
修改jquery中dialog的title属性方法(推荐)
2016/08/26 Javascript
原生JS实现图片翻书效果
2017/02/16 Javascript
JS实现为动态创建的元素添加事件操作示例
2018/03/17 Javascript
vue中的过滤器实例代码详解
2019/06/06 Javascript
关于vue的列表图片选中打钩操作
2020/09/09 Javascript
uniapp开发小程序实现滑动页面控制元素的显示和隐藏效果
2020/12/10 Javascript
pandas全表查询定位某个值所在行列的方法
2018/04/12 Python
解决python3 pika之连接断开的问题
2018/12/18 Python
Python基本数据结构之字典类型dict用法分析
2019/06/08 Python
python 使用装饰器并记录log的示例代码
2019/07/12 Python
Python基于类路径字符串获取静态属性
2020/03/12 Python
python实现IOU计算案例
2020/04/12 Python
python 批量下载bilibili视频的gui程序
2020/11/20 Python
Pandas之缺失数据的实现
2021/01/06 Python
CSS3 分类菜单效果
2019/05/27 HTML / CSS
css3实现小箭头各种图形效果
2020/07/08 HTML / CSS
英国最全面的橄榄球联盟门票网站:Live Rugby Tickets
2018/10/06 全球购物
Foot Locker澳洲官网:美国运动服和鞋类零售商
2019/10/11 全球购物
屈臣氏越南官网:Watsons越南
2021/01/14 全球购物
优秀中学生事迹材料
2014/01/31 职场文书
工作说明书格式
2014/07/29 职场文书
幼儿园开学通知
2015/04/24 职场文书
“5.12”护士节主持词
2015/07/04 职场文书
观看禁毒宣传片后的感想
2015/08/11 职场文书
靠谱准确的求职信
2019/04/02 职场文书
Golang二维切片初始化的实现
2021/04/08 Golang
springcloud之Feign超时问题的解决
2021/06/24 Java/Android
【海涛DOTA解说】EVE女子战队独家录像加ZSMJ神牛两连发
2022/04/01 DOTA
Mysql中常用的join连接方式
2022/05/11 MySQL