jQueryでextendを使う方法

零到壹度
リリース: 2018-04-02 16:12:27
オリジナル
1426 人が閲覧しました


この記事は、jQuery で extend を使用する方法について詳しく説明しています。その内容は、困っている友人に役立つことを願っています。 extend メソッドは、jQuery と jQuery.fn という 2 つの異なるオブジェクトにマウントされていますが、jQuery の内部コード実装は同じですが、機能が異なります。

まずは公式の説明を見てみましょう:

jQuery.extend

2 つ以上のオブジェクトの内容を最初のオブジェクトに結合します。 2 つ以上のオブジェクトの内容を最初のオブジェクトに結合します。 2 つ以上のオブジェクトのコンテンツを最初のオブジェクトにまとめます。
  • jQuery.fn.extend オブジェクトのコンテンツを jQuery プロトタイプにマージして、新しい jQuery インスタンス メソッドを提供します。新しい jQuery

    インスタンス メソッド
  • jQuery.extendの拡張メソッド機能については公式には言及されていませんが、jQueryの

    クラスメソッド
  • を拡張する機能も持っています。

オブジェクトの結合

まずは

オブジェクトの結合におけるextend関数の使い方を紹介します。

jQuery.extend(target [, object1] [, objectN])
ログイン後にコピー

object1 ... objectN をターゲット オブジェクトにマージします。パラメータが 1 つだけの場合、ターゲット オブジェクトは jQuery オブジェクトにマージされます。

var obj1 = {
    name: 'Tom',
    age: 21
}

var obj2 = {
    name: 'Jerry',
    sex: 'boy'
}

$.extend(obj1, obj2); // {name: "Jerry", age: 21, sex: "boy"}

obj1 // {name: "Jerry", age: 21, sex: "boy"}
obj2 // {name: "Jerry", sex: "boy"}
ログイン後にコピー

上述代码展示的是将 obj2 对象合并到 obj1 对象中,这种方法会 改变 obj1 对象的结构。如果你 不想改变 合并目标对象的结构,你可以这么做。

var obj1 = {
    name: 'Tom',
    age: 21
}

var obj2 = {
    name: 'Jerry',
    sex: 'boy'
}

$.extend({}, obj1, obj2); // { name: "Jerry", age: 21, sex: "boy" }

obj1 // { name: "Tom", age: 21 }
obj2 // { name: "Jerry", sex: "boy" }
ログイン後にコピー

深浅拷贝

jQuery.extend([deep], target, object1 [, objectN])
ログイン後にコピー

和上面的讲述的不同的是,该方法多了一个类型为 boolean 的 [deep] 传参,当其为 true 时,将 object1 , objectN 深度复制 后合并到 target 中。

首先,我们理解一下什么叫做 深度复制 。看看其和 浅度复制 有什么区别。

var obj1 = {
    name: "John",
    location: {
        city: "Boston",
        county: "USA"
    }
}

var obj2 = {
    last: "Resig",
    location: {
        state: "MA",
        county: "China"
    }
}

$.extend(false, {}, obj1, obj2); // { name: "John", last: "Resig", location: { state: "MA", county: "China" }}

$.extend(true, {}, obj1, obj2); // { name: "John", last: "Resig", location: { city: "Boston", state: "MA", county: "China" }}
ログイン後にコピー

由此可见,执行 深度复制 会递归遍历每个对象中含有复杂对象(如:数组、函数、json对象等)的属性值进行复制,而且 浅度复制便不会这么做。

方法扩展

上述的 extend 方法中的 target 参数是可以省略的。如果省略了,则该方法就只能传入一个 object 参数,该方法功能是将该 object 合并到调用 extend 方法的对象中。

我们通常会使用这种方式来对 jQuer进行一些方法上的扩展。

引子

jQurey 提供了两种方法扩张方式,分别为jQuery.fn.extend(object)jQuery.extend(object).

想要搞清楚两种扩展方式之间的区别的话,先要了解什么是jQuery.fn.

本猿参考了 jQuery 的源码,发现其中玄机:

jQuery.fn = jQuery.prototype = {   
    init: function(selector, context) {
        // ...
    };
}
ログイン後にコピー

jQuery.fn = jQuery.prototype这句代码明确指出jQuery.fn指代的就是 jQuery 的原型

其次,我们要引入两个概念 类方法实例方法

  • 类方法 是直接可以使用类引用,不需要实例化就可以使用的方法。一般在项目中 类方法 都是被设置为工具类使用;

  • 实例方法 必须先创建实例,然后才能通过实例调用该 实例方法

jQuery可以看做是这个封装得非常好的类,而我们可以使用jQuery选择器来创建 jQuery 的实例。比如:使 id 选择器$('#btn')来创建一个实例。

区别

jQuery.extend(object)相当于对 类方法 的扩展。

jQuery.extend({
    /* 返回两个元素中较小的值 */
    min: function(a, b) {
        return a < b ? a : b;
    },
    /* 返回两个元素中较大的值 */
    max: function(a, b) {
        return a > b ? a : b;
    }
});

jQuery.min(2, 3); // 2 
jQuery.max(4, 5); // 5
ログイン後にコピー

jQuery.fn.extend(object)是对jQuery.prototype上的扩展。

jQuery.fn.extend = jQuery.prototype.extend
ログイン後にコピー

这种方式相当对 实例方法 的扩展。

举个栗子:
开发一个简单的小功能,使用该方法可以使选定元素内的文字变红。

$.fn.extend({
    setRed: function() {
        $(this).css("color", "red");
    }
});

$(&#39;.tip&#39;).setRed();
ログイン後にコピー

$(".tip")创建了一个jQuery实例,通过它可以调用成员方法setRed.

上述代码可以实现预想的扩展,但最好返回this 以满足 jQuery 链式操作 的需要。

改良之后,代码如下:

$.fn.extend({
    red: function() {
        return $(this).css("color", "red");
    }
});
ログイン後にコピー

以上がjQueryでextendを使う方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート