2012-03-11 58 views
13

jQuery有一個非常整潔的extend方法,它將2個對象合併成一個。爲什麼要將空對象傳遞給jQuery的擴展方法?

jQuery Plugins authoring page他們顯示舉例如下:

var settings = $.extend({ 
    'location'   : 'top', 
    'background-color' : 'blue' 
}, options); 

不過,我已經看到了很多的插件傳遞一個空對象作爲第一個參數,像這樣:

var settings = $.extend({}, { 
    'location'   : 'top', 
    'background-color' : 'blue' 
}, options); 

據就我所知,這兩個人完全一樣。唯一的區別是,如果defaults會被存儲在其自己的變量:

var defaults = { 
    'location'   : 'top', 
    'background-color' : 'blue' 
}, 
settings = $.extend({}, defaults, options); 

這樣,您就可以隨時訪問你的違約沒有他們由options被覆蓋。


這裏的問題:爲什麼很多插件作者選擇一個空的對象傳遞給extend,即使他們不默認存儲在一個變量?

我錯過了什麼嗎?

+1

似乎毫無意義的我。這是一個人口稠密的,複製到一個空的,並丟棄它。你的第三個例子顯示了一個有效的原因我猜人們這樣做是因爲他們不考慮他們在做什麼。 – 2012-03-11 20:20:18

+0

@amnotiam這正是我的想法,但我見過*很多*插件做到這一點。顯然我錯過了一些東西... – 2012-03-11 20:21:09

+0

不,我認爲麻煩在於你*得到了*某物。 – 2012-03-11 20:21:41

回答

8

可能原因(對第二個例子) ...

  • 繼承無知...(看到它這樣做的方式,並複製實踐)

  • 本質的無知,(看到它得當作爲你最後的代碼塊,但與上即時更換對象緩存的對象並且不知道空的物體應該被移除)

  • 全球變暖。注重細節...

  • 缺乏(類似於2點,知道它是沒有必要的,但從來沒有真正花時間來檢查代碼)

  • 全球變冷。

  • 過於防禦性編碼... (怕的默認值可能在某一天被修改成可重複使用的對象,並且是怕空對象將不會在那時被插入)

  • jQuery的開發人員始終做什麼的聲音告訴他們;-)

總體而言,你是對的。創建中間對象,將其複製到空對象,然後丟棄。這是一種不必要和浪費的做法。

9

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的定義extend

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. 

,另外這句話是很重要的:

請記住,目標對象(第一個參數)將被修改, 並且也將從$返回。延伸()。因此,通過使作爲{}第一參數

,即空的對象被擴展,然後返回。

再回到你的settings = $.extend({}, defaults, options);例子。如果您將其更改爲settings = $.extend(defaults, options);,則設置將相同,但這裏默認值也會更改。這就是爲什麼你需要第一個參數是{}

+0

感謝您的更新,但這正是我在我的問題中所描述的。我理解在第三個示例中使用空對象的好處。我想了解的是我的第一個和第二個例子之間的區別... – 2012-03-11 21:19:12

+0

我想我沒有跟隨你的問題。我喜歡社區wiki的答案,爲什麼人們喜歡寫例子#2。 – miki725 2012-03-11 21:40:25

+0

我終於意識到你是對的,當我不小心毀掉了'$ .extend {}'中的第一個對象時,我不希望它被改變。 – jasonslyvia 2014-03-12 02:03:50

3

投入的另一個方法是什麼三木說:

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 
+0

同樣,這正是我在我的問題中所概述的。看我的第三段代碼(和它的前一段)。 – 2013-01-01 01:14:37

+0

我想我不明白你的問題。你問:爲什麼這麼多的插件作者選擇通過一個空的對象來擴展?我的答案可能是爲什麼。將您的默認值存儲在變量中不會阻止它們被覆蓋。 – ianstarz 2013-01-01 18:12:07

+0

我的問題是:爲什麼很多插件作者選擇傳遞一個空對象來擴展*即使它們不將默認值存儲在變量*中?我更新了我的問題以澄清這一點。 – 2013-01-01 18:14:21

相關問題