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);
  • 相关阅读:
    【leetcode】Binary Search Tree Iterator
    【leetcode】Palindrome Partitioning II
    【leetcode】Best Time to Buy and Sell Stock III
    【leetcode】Best Time to Buy and Sell Stock II
    【leetcode】Longest Consecutive Sequence
    【leetcode】Factorial Trailing Zeroes
    【leetcode】Simplify Path
    【leetcode】Generate Parentheses
    【leetcode】Combination Sum II
    【leetcode】Combination Sum
  • 原文地址:https://www.cnblogs.com/kasmine/p/6344383.html
Copyright © 2011-2022 走看看