使用prototype.js 的時候應(yīng)該特別注意的幾個問題.
更新時間:2007年04月12日 00:00:00 作者:
1. String.prototype.camelize BUG
這個方法用來返回字符串的駱駝寫法。用js 控制元素的 style的時候經(jīng)常使用
比如
var ss="font-color"
ss=ss.camelize() // fontColor
通常情況下 camelize 會工作得很好,但是有一個特列,那就是浮動定位 float
var ss="float"
obj.style[ss.camelize()]="right" // 這將導(dǎo)致一個錯誤。
顯然,作者沒有考慮 float這種特殊情況,正確的寫法是:
ie: obj.style.styleFloat="right"
ff: obj.style.cssFloat="right"
2. String.prototype.inspect BUG
這里 inspect 方法是有Bug的, 作者用replace 方法的時候沒有用正則,導(dǎo)致只能替換掉第一個匹配的字符。
正確的寫法應(yīng)該這樣
inspect: function() {
return "'" + this.replace(/\\/g, '\\\\').replace(/"/g, '\\\"') + "'";
}
3. Array.prototype.all BUG
這個方法檢測是否數(shù)組中所有元素都能夠讓迭代函數(shù)為真。 如果全部能滿足,則返回true,否則返回false
var f=function(x){return x%2==0} //檢查一個數(shù)是否是偶數(shù)
var arr=[2,4,6]
alert (arr.all(f)==true) //顯示 true
但是當(dāng) arr為空的時候,仍然返回 true
var arr=[]
alert(arr.all(f)==true) //顯示true
4. Array.prototype.any BUG
同 all方法,對空數(shù)組仍然返回true
5.Array.prototype.detect 也就是 find方法
這個不是 Bug ,但是不看原代碼很容易讓人誤解,從而出錯。
這個方法查找第一個能滿足 迭代函數(shù) 的元素,最后返回元素的值
誤解一:
var f=function(x){return x%2==0} //檢測是否是偶數(shù)
var arr=[1,3,5,7] //故意定義一個全為奇數(shù)的數(shù)組。
alert(arr.find(f)==false) //false
//很多人誤以為 find 函數(shù)在找不到滿足條件的元素的時候會返回 false ,實際上,它返回的是 "undefined"
誤解二:
尋找數(shù)組中的數(shù)字元素
var f=function(x){return !isNaN(x) && typeof(x)==="number"}
var arr=[false,"go_rush",0,"阿舜"]
if (arr.find(f)) alert("數(shù)組中含有數(shù)字元素") //事實上 這個 alert永遠不會執(zhí)行。
因為 find方法返回的是第一個符合條件的值。 這里返回:0. 所以.....
6. 對hash 對象的處理需要格外小心的地方
var hash={member:1,test:2,ids:3}
alert(hash.member)
alert($H(hash).inspect())
alert($H(hash).toQueryString())
//hash.member實際是存在的 但是.inspect() 和 .toQueryString()卻當(dāng)它不存在
同樣下面這些屬性也會和 prototype.js 相沖突。
each, all, any, collect, detect, findAll, grep, include, inject, invoke, max, min,
partition, pluck, reject, sortBy, toArray, zip, inspect, map, find, select, member, entries
這個方法用來返回字符串的駱駝寫法。用js 控制元素的 style的時候經(jīng)常使用
比如
var ss="font-color"
ss=ss.camelize() // fontColor
通常情況下 camelize 會工作得很好,但是有一個特列,那就是浮動定位 float
var ss="float"
obj.style[ss.camelize()]="right" // 這將導(dǎo)致一個錯誤。
顯然,作者沒有考慮 float這種特殊情況,正確的寫法是:
ie: obj.style.styleFloat="right"
ff: obj.style.cssFloat="right"
2. String.prototype.inspect BUG
這里 inspect 方法是有Bug的, 作者用replace 方法的時候沒有用正則,導(dǎo)致只能替換掉第一個匹配的字符。
正確的寫法應(yīng)該這樣
inspect: function() {
return "'" + this.replace(/\\/g, '\\\\').replace(/"/g, '\\\"') + "'";
}
3. Array.prototype.all BUG
這個方法檢測是否數(shù)組中所有元素都能夠讓迭代函數(shù)為真。 如果全部能滿足,則返回true,否則返回false
var f=function(x){return x%2==0} //檢查一個數(shù)是否是偶數(shù)
var arr=[2,4,6]
alert (arr.all(f)==true) //顯示 true
但是當(dāng) arr為空的時候,仍然返回 true
var arr=[]
alert(arr.all(f)==true) //顯示true
4. Array.prototype.any BUG
同 all方法,對空數(shù)組仍然返回true
5.Array.prototype.detect 也就是 find方法
這個不是 Bug ,但是不看原代碼很容易讓人誤解,從而出錯。
這個方法查找第一個能滿足 迭代函數(shù) 的元素,最后返回元素的值
誤解一:
var f=function(x){return x%2==0} //檢測是否是偶數(shù)
var arr=[1,3,5,7] //故意定義一個全為奇數(shù)的數(shù)組。
alert(arr.find(f)==false) //false
//很多人誤以為 find 函數(shù)在找不到滿足條件的元素的時候會返回 false ,實際上,它返回的是 "undefined"
誤解二:
尋找數(shù)組中的數(shù)字元素
var f=function(x){return !isNaN(x) && typeof(x)==="number"}
var arr=[false,"go_rush",0,"阿舜"]
if (arr.find(f)) alert("數(shù)組中含有數(shù)字元素") //事實上 這個 alert永遠不會執(zhí)行。
因為 find方法返回的是第一個符合條件的值。 這里返回:0. 所以.....
6. 對hash 對象的處理需要格外小心的地方
var hash={member:1,test:2,ids:3}
alert(hash.member)
alert($H(hash).inspect())
alert($H(hash).toQueryString())
//hash.member實際是存在的 但是.inspect() 和 .toQueryString()卻當(dāng)它不存在
同樣下面這些屬性也會和 prototype.js 相沖突。
each, all, any, collect, detect, findAll, grep, include, inject, invoke, max, min,
partition, pluck, reject, sortBy, toArray, zip, inspect, map, find, select, member, entries
相關(guān)文章
滾動經(jīng)典最新話題[prototype框架]下編寫
滾動經(jīng)典最新話題[prototype框架]下編寫...2006-10-10初學(xué)prototype,發(fā)個JS接受URL參數(shù)的代碼
初學(xué)prototype,發(fā)個JS接受URL參數(shù)的代碼...2006-09-09Prototype RegExp對象 學(xué)習(xí)
幫助文檔上沒有這個對象,實際上源代碼中這個對象還是有方法的,就1靜態(tài)方法,作用也不是很大,這里簡單說一下,因為以后介紹別的對象時會用到這個RegExp2009-07-07Prototype Template對象 學(xué)習(xí)
這里的Template對象其實就是格式化字符串的工具,就像java中的String.format方法。這個對象只提供一個方法evaluate。2009-07-07Prototype PeriodicalExecuter對象 學(xué)習(xí)
這個對象就是可以周期性的執(zhí)行某個方法,但是在它內(nèi)部維持了一個狀態(tài),可以防止由于某些原因一次調(diào)用沒執(zhí)行,然后下一次調(diào)用又來了,這樣會造成連續(xù)執(zhí)行兩次方法。上面的第二斷英文就是這個意思。2009-07-07