extend()在jQuery中如何工作?


119

我在插件中看到了这一点:

var options = $.extend(defaults, options); 

它是如何工作的?

怎么extend()办?


1
您可以在jQuery文档中阅读有关它的信息,但我想是一个更好的解释。
ifaour 2010年

jQuery有很好的文档。api.jquery.com只需在Search jQuery字段中输入方法名称。
user113716 2010年

42
我认为Todd想知道jQuery.extend的工作原理,而不是如何使用它。例如,它会遍历每个属性以创建一个全新的对象,还是以某种很棒的方式使用原型继承。
b01

Answers:


178

多个参数

该文档在解释扩展如何工作时不够精确,因此我进行了一些测试:

var a = {foo: 1, bar: 1};
var b = {foo: 2, baz: 2};
var c = {foo: 3};
var r = jQuery.extend(a,b,c);
console.log("A: Foo=" + a.foo + " Bar=" + a.bar + " Baz=" + a.baz);
console.log("B: Foo=" + b.foo + " Bar=" + b.bar + " Baz=" + b.baz);
console.log("C: Foo=" + c.foo + " Bar=" + c.bar + " Baz=" + c.baz);
console.log("R: Foo=" + r.foo + " Bar=" + r.bar + " Baz=" + r.baz);
console.log("A === R?: " + (a === r));

(该console.log函数旨在在Firebug中工作;如果需要,可以将其替换为alert()或其他一些输出函数)。

结果是:

A: Foo=3 Bar=1 Baz=2
B: Foo=2 Bar=undefined Baz=2
C: Foo=3 Bar=undefined Baz=undefined
R: Foo=3 Bar=1 Baz=2
A === R?: true

通过这个我们可以看到jQuery.extend():

  • 从第一个参数提供的对象开始。
  • 向其添加第二个参数中的任何属性。如果该属性已经存在于第一个参数中,则它将被覆盖。第二个参数的对象不变。
  • 使用任何后续参数重复上述操作。
  • 返回第一个参数。

这对于将用户和默认选项对象组合在一起以获得完整的选项集很有用:

function foo(userOptions) {
  var defaultOptions = {
    foo: 2,
    bar: 2
  };
  var someOtherDefaultOptions = {
    baz: 3
  };

  var allOptions = jQuery.extend(
    defaultOptions,
    someOtherDefaultOptions,
    userOptions
  );
  doSomething(allOptions);
}

foo({foo:1, baz:1});

请注意,“ null”是覆盖的有效值,但“ undefined”不是有效值。您也许可以利用它。

var a = {foo: "a", bar: "a"};
var b = {foo: null, bar: undefined};
jQuery.extend(a,b);
console.log("A: Foo=" + a.foo + " Bar=" + a.bar);

结果是:

A: Foo=null Bar=a

单参数

如果仅将一个对象传递给jQuery.extend(),则jQuery会假定该jQuery对象本身是“第一个”参数(即:要修改的参数),而您的对象是“第二个”参数(即:要添加到第一个参数的参数) 。所以:

console.log( "Before: " + jQuery.foo );
jQuery.extend({foo:1});
console.log( "After: " + jQuery.foo );

结果是:

Before: undefined
After: 1

3
因此,如果b.baz是一个对象{zed: 'dark'}而不是2您说而您设置了r.baz.zed = 'light',那么b.baz.zedbe 的值是多少?即属性是通过引用复制还是合并?
ErichBSchulz 2013年

4
回答我自己的问题,b.baz.zed将是light-即值通过引用合并。看到一个小提琴
ErichBSchulz

4
精彩的解释,+ 1
凯莉·肯德尔

2
我希望官方文件应该像这样清晰。+1
Thariq Nugrohotomo 2015年

2
$ .extend(true,object1,object2); 和$ .extend(object1,object2); 差异...
Vinay S Jain 2015年

27

它将一个对象的内容合并到另一个对象中。如果我们传递两个对象,则第二个对象属性将添加到第一个对象/第一个参数中

Ex: $.extend(object1, object2);

现在object1包含object2的属性

如果要合并两个对象,则需要在第一个参数中传递空对象

Ex: var newObject = $.extend({}, object1, object2);

现在,newObject包含object1和object2的属性


12

从jQuery文档

将两个或更多对象的内容合并到第一个对象中。

在插件上下文中:如果用户未设置该函数的可选参数,则将使用默认值。


1
这个答案应该在评论中。
Nolo

谢谢你!
Harsha Vardhan

7

extend()在jQuery中如何工作?[解决]

jQuery具有深层复制和浅层复制。第一个布尔值决定它,对于深度而言为true,对于光线而言为false。

例如:

  • jQuery.extend(false,{'a':{'a1':1}},{'a':{'a2':2}})

    结果将是:{'a':{'a2':2}},因为这是简单副本,只需比较级别1。

    在此处输入图片说明

  • jQuery.extend(true,{'a':{'a1':1}},{'a':{'a2':2}})

    结果将是:{'a':{'a1':1,'a2':2}}这是具有多个对象级别的深层副本(就像数组的级别一样)

    在此处输入图片说明

  • 具有a,b,c的jQuery.extend(a,b,c)是对象或数组。流覆盖将是b-> a,c-> a(b覆盖a,c覆盖a ...),此函数将返回a并也更改值。

高级示例:

  • jQuery.extend({'number_param':1})

    万一您只传递一个参数。jQuery将扩展自身。console.log(jQuery ['number_param'])将输出1。

    在此处输入图片说明

  • jQuery.extend(1,{'number_param':'2'}); 此示例未附加jQuery本身。第一个参数必须为布尔值。在这种情况下,它将返回{'number_param':'2'}并且jQuery不会更新。

    在此处输入图片说明

  • jQuery.extend(a,b,c,d,e,f); 订单合并将为。b-> a,c-> a,d-> a,e-> a,f-> a(b覆盖a,c覆盖a ...)。结果返回为a。

    其中a = {'p':1}。jQuery.extend(a,{'p':2},{'p':3},{'p':4},{'p':5})将返回a和a = {'p': 6}。传递给该功能的参数数量是无限的。

    在此处输入图片说明


1
扩展坞 “警告:不支持为第一个参数传递false。”
Nolo

2

目的是扩展现有对象。例如,如果我们有一个模板对象,并且想通过添加更多属性或覆盖现有属性来扩展它,则jQuery扩展可能会很有用。

var carObjectTemplate = {
"make": "honda",
"model":"city",
"mileage":"20",
"variant":"petrol"

};

现在,如果我们要扩展它, $.extend(true, {"color":"red"}, carObjectTemplate, {"model": 'amaze'}); 它将为我们提供输出,扩展carObjectTemplate并添加

{"color":"red"} property and overriding "model" property from "city" to "amaze"

第一个布尔参数true / false表示我们是否需要深拷贝或浅拷贝


深复制或浅复制是什么意思?
Selva Ganapathi

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.