真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

javascript的高級應用

http://www.zzbang.cn/html/dev/js/2007/11/09/51/[@more@]
1、關于javascript的apply和call函數(shù)
prototype.js中用了大量的apply和call函數(shù),不注意會造成理解偏差。
官方解釋:應用某一對象的一個方法,用另一個對象替換當前對象。
apply與call的區(qū)別是第二個參數(shù)不同。apply是 數(shù)組或者arguments 對象。而call是逗號隔開的任何類型。
apply,call方法最讓人混淆的地方也是apply,call的特色。但最好不要濫用。
能改變調(diào)用函數(shù)的對象。如下例,函數(shù)中用到this關鍵字,這時候this代表的是apply,call函數(shù)的第一個參數(shù)。



2、關于閉包
prototype.js在Class.create,bind等中用到javascript的閉包特色。但整體上prototype.js對于強大的閉包特性用的不多。大家可以參閱我翻譯的篇文章了解閉包。
3、讓我比較反感的兩個方法
(1)var Class = {
create: function() {
return function() {
this.initialize.apply(this, arguments);
}
}
}
很討厭用別的語言的風格來寫javascript。用這個方法構造自定義類 并沒有覺得有多方便,減少代碼行數(shù),只會讓人難理解,多定義一個initialize方法。
其實討厭這條有些牽強,不過修改Object的原型對象就有點過分了。
(2)Object.prototype.extend
先不過你取個extend的名字會讓熟悉java的人引起的歧義。修改Object的prototype就說不過去了。不知道作者是怎么考慮的。當你for in循環(huán)對象是,麻煩就來了??赡苡腥藭柲鉬or in干嗎。 我一個項目中既用了DWR,也用了prototype.js,dwr返回的javascript對象都多了個exetend屬性,還得特殊處理。
以前我比較過dojo和prototype.js中繼承的實現(xiàn),現(xiàn)在我明白個道理。對于javascript這種沒有靜態(tài)類型檢查,語法寬松的語言來講,如果你選擇了某個js類庫,那你也必須適應作者寫javascript的風格。prototype.js的作者對extend的使用爐火純青,如果我們不當它只是個屬性拷貝的函數(shù)的話,多讀讀prototype.js的代碼是好的。
4、關于函數(shù)的綁定
類庫提供了Function.prototype.bind Function.prototype.bindAsEventListener兩個方法。首先我們從概念上解釋一個這兩個方法。
任何一個函數(shù)都可以調(diào)用這兩個方法;參數(shù)的是javascript對象或網(wǎng)頁上元素對象;返回類型是個函數(shù)對象。
本來我就是個函數(shù),返回還是函數(shù),到這兩個函數(shù)有什么不同呢??磳崿F(xiàn)代碼,關鍵還是applycall函數(shù)的代碼。其實這里只是轉(zhuǎn)化了一下方法調(diào)用的對象。

Test

這是 上舉的例子,個人感覺沒什么意思,反而讓我對bind,bindAsEventListener有些反感。(javascript就是這樣,明明大家都知道的語法,但寫出來的代碼差別確很大)
看下面代碼:https://compdoc2cn.dev.java.net/

Test
從上面代碼可以看出bind/bindAsEventListener只是包裝了一下apply/call方法,改變方法的調(diào)用對象。如例子,你可以把obj.getName方法轉(zhuǎn)化成任何對象調(diào)用,并且把方法讓表單元素觸發(fā)。(bind和bindAsEventListener之間只是返回函數(shù)的參數(shù)不同)
這兩個方法也可以用在對象之間的方法重用,實現(xiàn)類似繼承方法的概念??匆韵麓a,其實是比較無聊的。


我從來沒讀過prototype.js的擴展項目代碼,也不知道bind..的最佳實踐,一起挖掘吧。但你絕對不要把bind/bindAsEventListener從綁定的詞義上來理解,可能會讓你更加迷惑。從apply/call理解本質(zhì)。應用某一對象的一個方法,用另一個對象替換當前對象。
5、關于事件的注冊

Test
執(zhí)行上面代碼,你就能明白Event.observe與bind/bindAsEventListener之間的區(qū)別:
(1) 顯然Event.observe有限制,只能處理簡單的函數(shù),并函數(shù)中不能有this之類的東西。
(2)Event.observe內(nèi)部用到addEventListener/attachEvent。能把多個函數(shù)加到一個觸發(fā)事件(window.onload)。bind是覆蓋。
6、關于事件監(jiān)聽最佳實踐
很顯然prototype.js提供的事件注冊方法不是很完善。那看看dojo的時間注冊吧(中文版),更加復雜,估計很多人像我一樣,對于dojo暫時持觀望態(tài)度。
如果你看過的前篇關于閉包的介紹,可能見過以下代碼。
看以下代碼前我想表述一個觀點,任何網(wǎng)頁中元素,瀏覽器都會為你創(chuàng)建一個對象()。(我覺得)這些對象與你建立javascript對象區(qū)別是它們有事件監(jiān)聽,會響應鼠標鍵盤的事件。如果你用了以下代碼,那么把事件監(jiān)聽代碼很好的轉(zhuǎn)化到你的javascript代碼中。
function associateObjWithEvent(obj, methodName){
return (function(e){
e = e||window.event;
return obj[methodName](e, this);
});
}
function DhtmlObject(elementId){
var el = getElementWithId(elementId);
if(el){
el.onclick = associateObjWithEvent(this, "doOnClick");
el. = associateObjWithEvent(this, "doMouseOver");
el. = associateObjWithEvent(this, "doMouseOut");
}
}
DhtmlObject.prototype.doOnClick = function(event, element){
... // doOnClick method body.
}
DhtmlObject.prototype.doMouseOver = function(event, element){
... // doMouseOver method body.
}
DhtmlObject.prototype.doMouseOut = function(event, element){
... // doMouseOut method body.
}

本文標題:javascript的高級應用
地址分享:http://weahome.cn/article/ijpces.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部