Javascript 为什么要将空对象传递给jQuery';什么是扩展方法?

Javascript 为什么要将空对象传递给jQuery';什么是扩展方法?,javascript,jquery,object,Javascript,Jquery,Object,jQuery有一个非常简洁的方法,它将两个对象合并为一个 在屏幕上,它们显示了一个示例,如下所示: var settings = $.extend({ 'location' : 'top', 'background-color' : 'blue' }, options); 但是,我看到许多插件将空对象作为第一个参数传递,如下所示: var settings = $.extend({}, { 'location' : 'top',

jQuery有一个非常简洁的方法,它将两个对象合并为一个

在屏幕上,它们显示了一个示例,如下所示:

var settings = $.extend({
    'location'         : 'top',
    'background-color' : 'blue'
}, options);
但是,我看到许多插件将空对象作为第一个参数传递,如下所示:

var settings = $.extend({}, {
    'location'         : 'top',
    'background-color' : 'blue'
}, options);
据我所知,这两个人做的事情完全一样。唯一的区别是,如果
默认值
存储在它自己的变量中:

var defaults = {
    'location'         : 'top',
    'background-color' : 'blue'
},
settings = $.extend({}, defaults, options);
这样,您就可以随时访问默认值,而不必被
选项
覆盖


问题是:为什么这么多插件作者选择将空对象传递给
extend
,即使他们没有将默认值存储在变量中


我遗漏了什么吗?

Extend是复制对象的一个非常有用的函数

例如,考虑这个:

foo = {'foo':'a'}
f = foo
f.foo = 'hello'
console.log(f)
    Object {foo="hello"}
console.log(foo)
    Object {foo="hello"}

f = $.extend({},foo)
f.foo = 'hello world'
console.log(f)
    Object {foo="hello world"}
console.log(foo)
    Object {foo="hello"}
如您所见,$.extend实际上复制了该对象

编辑

第一个参数必须为空对象的原因在于
extend
的工作方式。以下是jQuery如何定义扩展:

jQuery.extend( target [, object1] [, objectN] )
   target    An object that will receive the new properties
             if additional objects are passed in or that will
             extend the jQuery namespace if it is the sole argument.
   object1   An object containing additional properties to merge in.
   objectN   Additional objects containing properties to merge in.
此外,这句话很重要:

请记住,目标对象(第一个参数)将被修改, 也将从$.extend()返回

因此,通过将
{}
作为第一个参数传递,该空对象将被扩展,然后返回

回到您的
settings=$.extend({},默认值,选项)示例。如果要将其更改为
settings=$.extend(默认值、选项),设置将相同,但此处默认值也将更改。这就是为什么需要将第一个参数设置为
{}
可能的原因(对于第二个示例)

  • 遗传的无知。。。(看到它是那样做的,并模仿了这种做法)

  • 内在无知。。。(在上一个代码块中看到它正确地完成了,但是用动态对象替换了缓存对象,并且不知道应该删除空对象)

  • 全球变暖

  • 缺乏对细节的关注。。。(与第2点类似,知道这不是必需的,但从未真正花时间检查代码)

  • 全球冷却

  • 过度防御的编码。。。(担心有一天会将默认值改写为可重用对象,并担心此时不会插入空对象)

  • jQuery开发人员总是按照声音告诉他们的去做;-)


总的来说,你是对的。创建中间对象,将其复制到空对象,然后丢弃。这是一种不必要且浪费的做法。

另一种表达miki所说内容的方式:

var defaults = {
  one: 'foo',
  two: 'bar'
};

var options = {
  two: 'apples',
  three: 'bananas'
};

// The safe way to extend
var settings = $.extend({}, defaults, options);

console.log( settings ); // {one: 'foo', two: 'apples', three: 'bananas'}
console.log( defaults ); // {one: 'foo', two: 'bar'}
console.log( options ); // {two: 'apples', three: 'bananas'}
console.log( settings === defaults ); // false

// Careless way to extend
var settings = $.extend(defaults, options);

console.log( settings ); // {one: 'foo', two: 'apples', three: 'bananas'}
console.log( defaults ); // {one: 'foo', two: 'apples', three: 'bananas'}
console.log( options ); // {two: 'apples', three: 'bananas'}
console.log( settings === defaults ); // true

对我来说似乎毫无意义。它制作一个填充的,复制成一个空的,然后丢弃它。您的第三个示例显示了一个有效的原因。我猜人们这样做是因为他们不考虑自己在做什么。@amnotiam这正是我所想的,但我见过这么多插件这样做。很明显,我遗漏了一些东西……不,我想问题是你得到了一些东西。我想可能是防御性编码。“如果有一天我决定将其存储在变量中,但我忘记了……”之类的事情。理论:有人有了第三种形式,意识到他们不需要变量,然后“优化”成第二种形式。其他插件获得代码是因为他们使用了“复制和修改”编程风格。其他人看到了,只是认为这样做有很好的理由。谢谢你的更新,但这正是我在问题中描述的。在我的第三个示例中,我理解使用空对象的好处。我想理解的是我的第一个和第二个例子之间的区别……我想我没有理解你的问题。我喜欢社区维基关于人们为什么喜欢写示例#2的答案。当我意外地破坏了
$中的第一个对象时,我终于意识到你是对的。扩展{}
,我不希望它被更改。清楚的解释;应将其标记为解决方案。这是正确的解释,这正是我在问题中所概述的。请参阅我的第三段代码(及其前一段)。我想我不明白您的问题。你会问:为什么这么多插件作者选择传递一个空对象来扩展?我的答案可能是为什么。将默认值存储在变量中不会阻止它们被覆盖。我的问题是:为什么这么多插件作者选择传递一个空对象进行扩展,即使他们没有将默认值存储在变量中?我更新了我的问题来澄清这一点。啊,我现在明白了,哈哈。这是有道理的,是的,我同意另一个答案。哦,充满活力的jQuery插件开发人员社区,肯定有很多古怪的做法。