zoukankan      html  css  js  c++  java
  • JQuery 源码解析 · extend()详解

    前言:最近想重写一个dropdown插件,于是想到了使用jquey实现插件,于是重温了一波$.extend()的知识,然后总结了这篇笔记

    正文:

    1. $.extend(src) 
    • jQuery.extend(  target, object1 [, objectN ] )

      该方法将src合并到jquery的实例对象中去 

      下面是一个例子:

          var newSrc=$.extend({},src1,src2,src3...)//也就是将"{}"作为dtarget 目标参数 

      这样就可以将src1,src2,src3...进行合并,然后将合并结果返回给newSrc了。如下例:

         var result=$.extend({},{name:"Tom",age:21},{name:"Jerry",sex:"Boy"}) 

      那么合并后的结果,同名属性会被后面的对象所覆盖

    1 console.log(result)
    2 >> {name:"Jerry",age:21,sex:"Boy"}

      在ES6中,实现这种方法有一种更为简单的方法,利用点扩展运算符

    1 var person1={name:"Tom",age:21}
    2 var person2={name:"Jerry",sex:"Boy"}) 
    3 
    4 person1={...(person1),...(person2)}
    • jQuery.extend( [deep ], target, object1 [, objectN ] )

      第一个参数boolean代表是否进行深度拷贝,其余参数和前面介绍的一致,看下面这个例子

     1 var object1 = {
     2 apple: 0,
     3 banana: { weight: 52, price: 100 },
     4 cherry: 97
     5 };
     6 var object2 = {
     7 banana: { price: 200 },
     8 durian: 100
     9 };
    10 
    11 // Merge object2 into object1
    12 $.extend( object1, object2 );
    13 
    14 console.log(JSON.stringify( object1 );
    15 >>{"apple":0,"banana":{"price":200},"cherry":97,"durian":100}

       经过浅拷贝后,banana属性是对象类型,属于引用类型,指向object2的banana对象,所以没有了weight属性

      我们再看一下,如果是深度拷贝,则输出结果为:

    1 $.extend( true, object1, object2 );
    2 console.log(JSON.stringify( object1 );
    3 >>{"apple":0,"banana":{"weight":52,"price":200},"cherry":97,"durian":100}

      2. $.fn.extend(src)

      该方法就是将src合并到jquery的全局对象中去

     1 jQuery.fn.extend({
     2 check: function() {
     3 return this.each(function() {
     4 this.checked = true;
     5 });
     6 },
     7 uncheck: function() {
     8 return this.each(function() {
     9 this.checked = false;
    10 });
    11 }
    12 });
    13 
    14 // Use the newly created .check() method
    15 $( "input[type='checkbox']" ).check();

      扩展,进阶

      利用这个函数,我们可以来写JQuery插件

     1 var Dropdown= function(element) {
     2 var self=this;
     3 var target=$(element).data("target");
     4 self.$element=$(element);
     5 self.$target=$(target);
     6 self.$element.on('mouseleave',function(){
     7 self.close(self.$target);
     8 });
     9 self.$element.on('mouseenter',function(){
    10 self.open(self.$target);
    11 });
    12 }
    13 //定义haorooms的方法
    14 Dropdown.prototype = {
    15 open: function($target) {
    16 return $target.show();
    17 },
    18 close:function($target){
    19 return $target.hide();
    20 }
    21 }
    $.fn.myPlugin = function() {
    //创建Dropdown的实体
    var dropdown= new Dropdown(this);
    }

      插件的使用

    $(function() {
    $('.dropdown').myPlugin();
    })

    然后用一个即使匿名函数,将我们的代码包裹起来,防止污染全局环境、防止其他地方使用到了 我们自定义插件的对象。

    ;(function($,window,document,undefined){
    //我们的代码。。
    })(jQuery,window,document);
  • 相关阅读:
    003_&#x和ASCII的关系及URL中的中文转义
    001_机器学习的Hello world之MNIST手写数字识别模型
    Appnium安装-Mac平台
    Code Review 规范
    Spring AOP-xml配置
    JTLParser-linux上jmeter的jtl文件二次分析
    测试覆盖率Emma工具使用
    jmeter之java请求
    jmeter测试总结
    jstat监控gc情况
  • 原文地址:https://www.cnblogs.com/kasmine/p/6344383.html
Copyright © 2011-2022 走看看