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 冒泡排序 正序和倒序实现代码
Dec 14 Javascript
Javascript调用C#代码
Jan 17 Javascript
javascript中onclick(this)用法介绍
Apr 19 Javascript
JavaScript 对任意元素,自定义右键菜单的实现方法
May 08 Javascript
JS写的贪吃蛇游戏(个人练习)
Jul 08 Javascript
解析jQuery的三种bind/One/Live事件绑定使用方法
Dec 30 Javascript
JavaScript实现在标题栏上显示当前日期的方法
Mar 19 Javascript
Bootstrap入门书籍之(一)排版
Feb 17 Javascript
微信JSAPI支付操作需要注意的细节
Jan 10 Javascript
layui实现动态和静态分页
Apr 28 Javascript
小程序rich-text组件如何改变内部img图片样式的方法
May 22 Javascript
js实现倒计时秒杀效果
Mar 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安全性需要注意的几点事项
2014/07/17 PHP
详解thinkphp中的volist标签
2018/01/15 PHP
PHP PDOStatement::fetchAll讲解
2019/01/31 PHP
PHP Cli 模式设置进程名称的方法
2019/06/12 PHP
JavaScript方法和技巧大全
2006/12/27 Javascript
用Javascript实现锚点(Anchor)间平滑跳转
2009/09/08 Javascript
javascript中声明函数的方法及调用函数的返回值
2014/07/22 Javascript
Jquery解析Json格式数据过程代码
2014/10/17 Javascript
JS实现适合于后台使用的动画折叠菜单效果
2015/09/21 Javascript
通过BootStrap实现轮播图的实际应用
2016/09/26 Javascript
AngularJS Phonecat实例讲解
2016/11/21 Javascript
深入理解vue-loader如何使用
2017/06/06 Javascript
vue.js如何更改默认端口号8080为指定端口的方法
2017/07/14 Javascript
Vue 创建组件的两种方法小结(必看)
2018/02/23 Javascript
解决vue-router中的query动态传参问题
2018/03/20 Javascript
微信小程序实现聊天对话(文本、图片)功能
2018/07/06 Javascript
js使用ajax传值给后台,后台返回字符串处理方法
2018/08/08 Javascript
vue监听input标签的value值方法
2018/08/27 Javascript
关于微信公众号开发无法支付的问题解决
2018/12/28 Javascript
Angular+ionic实现折叠展开效果的示例代码
2020/07/29 Javascript
python通过yield实现数组全排列的方法
2015/03/18 Python
Linux下用Python脚本监控目录变化代码分享
2015/05/21 Python
python实现给数组按片赋值的方法
2015/07/28 Python
Python selenium文件上传方法汇总
2020/11/19 Python
Python处理Excel文件实例代码
2017/06/20 Python
Python实现的基于优先等级分配糖果问题算法示例
2018/04/25 Python
Python中__slots__属性介绍与基本使用方法
2018/09/05 Python
python使用多进程的实例详解
2018/09/19 Python
印度电子产品购物网站:Vijay Sales
2021/02/16 全球购物
Vrbo英国:预订度假屋
2020/08/19 全球购物
会计师事务所审计实习自我鉴定
2013/09/20 职场文书
致短跑运动员广播稿
2014/01/09 职场文书
商场活动策划方案
2014/01/24 职场文书
股权转让协议书
2014/12/07 职场文书
分享五个Node.js开发的优秀实践 
2022/04/07 NodeJs
Nginx速查手册及常见问题
2022/04/07 Servers