- 靜態全域 (jQuery.extended)
定義後,只需使用 jQuery 的前置符號就可以使用。 - 需依附於元素(jQuery.fn.extend)
定義後,只針對 jQuery 所選取的元素有效。
jQuery.extended
所定義的 add 方法, jQuery 任何時候都可以叫用。
<script> jQuery.extend({ add: function(a, b) { return a + b; } }); alert($.add(3, 4)); //7 </script>
jQuery.fn.extend
所定義的 red 方法,必須是某個 jQuery 所挑選到的元素才能使用。如範例,符合 $('#test') 的所有元素,都可以執行 red( )。
<script> jQuery.fn.extend({ red: function() { return $(this).css('color', '#ff0000'); } }); $('#test').red(); </script>
上述所介紹,都是針對 jQuery 原先所沒有的功能而進行新增。但有個問題來了,假設如果原先就已經存在了某個方法 add( ),但擴展的方法也同樣有個方法 add( ),那不就鬧雙包?接下來的問題,則是要以誰的為主?是元配,還是新歡呢?通常都是只見新人笑,不見舊人哭囉~在 jQuery 官網上可以找到這問題的處理方式。
情況一:合併兩個物件,後面的物件內容會覆蓋前面的物件內容
var object1 = { apple: 0, banana: {weight: 52, price: 100}, cherry: 97 }; var object2 = { banana: {price: 200}, durian: 100 }; $.extend(object1, object2);
//結果 object1 === {apple: 0, banana: {price: 200}, cherry: 97, durian: 100}
情況二:合併兩個物件,後面物件內容裡的詳細屬性會覆蓋前面內容裡的詳細屬性(若前面內容裡的詳細屬性沒有重複,會被保留下來,也可視為深層合併)
var object1 = { apple: 0, banana: {weight: 52, price: 100}, cherry: 97 }; var object2 = { banana: {price: 200}, durian: 100 }; $.extend(true, object1, object2);
//結果 object1 === {apple: 0, banana: {weight: 52, price: 200}, cherry: 97, durian: 100}
情況三:合併兩個物件,但不會影響到這兩個物件的預設值。這是常見的 plug-in 開發模式作法。
var empty = {} var defaults = { validate: false, limit: 5, name: "foo" }; var options = { validate: true, name: "bar" }; var settings = $.extend(empty, defaults, options);
//結果 settings == { validate: true, limit: 5, name: "bar" } empty == { validate: true, limit: 5, name: "bar" }
綜合以上三個範例,
如果你想要對合併物件進行深層的物件合併,要在第一個參數加上 true
如果你不想影響2個合併物件的預設值,要採用情況三的開發模式
而其他,就是後面物件蓋掉前面物件了
參考:
1. http://blog.tugai.net/2009/07/22/jquery-fn-extend/
2.http://www.cnblogs.com/rhythmK/archive/2009/10/19/1585847.html
3.http://hzjavaeyer.group.javaeye.com/group/blog/232971
4.http://api.jquery.com/jQuery.extend/
沒有留言:
張貼留言