為了避免類似的情況出現(xiàn),我們用hasOwnProperty來檢索自己的數(shù)據(jù)對象。這樣childA的值將不會向上廣播到原型鏈,也就不能繼承父對象的值。事實上,避免使用hasOwnProperty來讀取數(shù)據(jù),也只有個在對象不具有該數(shù)據(jù)時才返回父對象的值。
另外一種方法是將數(shù)據(jù)存儲到本地對象自身中,但是,它不能返回數(shù)據(jù)對象,因為該對象不存在,如:
// ... if ( elem.nodeType ) { dataObject[ name ] = value; } else { elem[ expando +"_" + name ] = value; } // ...
robert.katic 推崇第一種方法,并重寫了$.data()和$.removeData()方法.
(function($){ var expando = "jQuery" + (new Date).getTime(), hasOwnProperty = Object.prototype.hasOwnProperty, _data = $.data, _removeData = $.removeData; $.data = function( obj, name, data ) { if ( obj.nodeType ) { return _data( obj, name, data ); } var thisCache, hasCache = hasOwnProperty.call( obj, expando ); if ( !hasCache && typeof name === "string" && data === undefined ) { return undefined; } if ( typeof name === "object" ) { obj[ expando ] = $.extend(true, {}, name); } else if ( !hasCache ) { obj[ expando ] = {}; } thisCache = obj[ expando ]; if ( typeof name === "string" ) { if ( data !== undefined ) { thisCache[ name ] = data; } return thisCache[ name ]; } return thisCache; }; $.removeData = function( obj, name ) { if ( obj.nodeType ) { return _removeData( obj, name ); } if ( name ) { if ( hasOwnProperty.call( obj, expando ) ) { delete obj[ expando ][ name ]; if ( $.isEmptyObject( obj[expando] ) ) { delete obj[ expando ]; } } } else { delete obj[ expando ]; } }; })(jQuery);
jQuery是一個很優(yōu)秀的庫,但是有時也免會有一些小瑕疵。而這些小瑕疵正是我們在使用時要特別小心。非常感謝robert.katic為我們詳細(xì)的分析了該方法的缺陷。
參考資料:http://forum.jquery.com/topic/data-object-and-memory-leak
原文:http://www.denisdeng.com/?p=805
本文鏈接:http://www.95time.cn/tech/web/2010/7486.asp
出處:
責(zé)任編輯:bluehearts
上一頁 jQuery.data()方法與內(nèi)存泄漏 [1] 下一頁
◎進(jìn)入論壇網(wǎng)頁制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評論。
|