理解$ .extend

时间:2015-12-12 15:16:31

标签: javascript jquery

嘿伙计们我刚刚浏览了parallax.js的代码,我遇到了以下代码:

$.extend(this, DEFAULTS, options, data);

我从未见过上面使用的$.extend(),我看过像:

$.extend({}, DEFAULTS, options, data);

上面的例子中this是一个jQuery对象,所以我不认为上面做了什么错误,但是有人可以告诉我为什么特别有用吗?一个例子将非常有用,因为我真的非常理解为什么使用上述代替$.extend({}, DEFAULTS, options, data);

可以找到代码行 HERE

谢谢。

3 个答案:

答案 0 :(得分:2)

根据 jQuery documentation 扩展将“...将两个或多个对象的内容合并到第一个对象。”

  

当两个或多个对象参数提供给$ .extend()时,   所有对象的属性都将添加到目标对象中。   忽略null或undefined的参数。

目标对象/第一个传递的对象将始终使用extend进行修改,并从函数返回。

但是如果对象声明保持不变,那么我们将{}对象作为第一个参数传递。

1 var object = $.extend({}, object1, object2,....,objectn);

要始终牢记几点:

  • 不支持为第一个参数传递false。
  • 不考虑未定义的属性。从对象的原型继承的属性将被复制。
  • 一般来说,合并执行在本质上不是递归的,但是通过为第一个函数参数传递true,对象将以递归方式合并。

特定于您的案例:

.extend()收到两个或多个对象时,它会获取第一个对象,并在其中添加其他对象中定义的方法和变量。

defaults = { size: 3 };
options = { height: 6 };
var opts = $.extend(defaults, options)
// 'defaults' receives the methods and variables defined in 'options'
// opts == defaults == { size: 3, height: 6 }
// options == { height: 6 };

如果第一个对象为空,它将在新对象中添加方法和变量。当我们想要对几个对象中定义的方法进行分组而不修改任何对象时,这非常有用。

像这样:

 var opts = $.extend( {}, defaults, options)
// 'opts' gets all methods and variables defined in 'defaults' and 'options',
// neither of them get modified.
// opts == { size: 3, height: 6 }
// defaults == { size: 3 };
// options == { height: 6 };

答案 1 :(得分:0)

我不是extend方法的导出,但我所知道的让我觉得这是解释:

$.extend({}, DEFAULTS, options, data);版本将默认值复制到空对象中,请参阅this question,了解人们为何会这样做。

$.extend(this, DEFAULTS, options, data);会将默认值复制到this引用的对象中。

我可以看到这被用作更新对象的默认值/选项/数据的方法,而不必指定可能已经设置的每个属性,这就是空对象版本会强制你做的事情。情况。

答案 2 :(得分:0)

你说this“...毕竟是一个jQuery对象。看一下你引用的源代码中的line 489

plugin = new Plugin(this, value);

插件被用作构造函数。这意味着this是对正在构造的对象的引用。因此,$.extend用于将成员按顺序从DEFAULTSoptionsdata对象复制到正在构造的对象中(因此options覆盖{{DEFAULTS 1}}和data会覆盖options)。