日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
jQuery另類視角:動(dòng)態(tài)擴(kuò)展對(duì)象

大家都知道Javascript是動(dòng)態(tài)語(yǔ)言,它對(duì)動(dòng)態(tài)的支持是與身俱來(lái)的,jQuery作為Javascript最為流行的框架之一,同樣有著這樣的特性。文章將從個(gè)人的角度出發(fā),研究jQuery的開發(fā)者是如何設(shè)計(jì)出access函數(shù),并讓它去支持動(dòng)態(tài)擴(kuò)展對(duì)象。

專注于為中小企業(yè)提供成都網(wǎng)站建設(shè)、成都做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)獻(xiàn)縣免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了千余家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

推薦專題:  jQuery從入門到精通

例如:有一個(gè)employee對(duì)象:

 
 
 
 
  1. function employee(){
  2.     this.e_id = 0;
  3.     this.e_name = "";
  4. }

現(xiàn)在需要為它動(dòng)態(tài)的新增"age"屬性和"toString()"方法:

 
 
 
 
  1. var empObj = new employee();
  2. empObj["age"] = 20;
  3. empObj["toString"] = function() { return this.e_id.toString() + this.e_name; };

一行簡(jiǎn)單的代碼就承擔(dān)了這項(xiàng)工作,這是Javascript內(nèi)置支持的,不過(guò)往往我們需要在這基礎(chǔ)上支持一定程度的擴(kuò)展,所以會(huì)將這一行簡(jiǎn)單的代碼抽成一個(gè)方法:

 
 
 
 
  1. function dym_setprop(obj, key, value) {
  2.     if (obj && key) {
  3.   obj[key] = value;
  4.     }
  5. }

看到這里,我們先讓思路做個(gè)跳轉(zhuǎn),跳到C#中的employee對(duì)象,如下:

在面向?qū)ο蟮木幊讨?,?duì)外使用的都是屬性(Get/Set),那么想想如何將這種方式簽入到Javascript中,現(xiàn)在讓我們跳回dym_setprop函數(shù)內(nèi),既在dym_setprop方法中不能使用obj[key]=value的直接賦值方式,而要支持Set。

 
 
 
 
  1. function dym_setprop(obj, key, value, fn) {
  2.     if (obj && key) {
  3.   fn(obj, key, value);
  4.     }
  5. }

參數(shù)fn,在dym_setprop中不直接操作任何對(duì)象,使用函數(shù)fn來(lái)代替相應(yīng)的操作代碼,則在這里除了支持Set外,還有其他很大的自由空間。讓我們繼續(xù)深入dym_setprop方法,現(xiàn)在我們把關(guān)注點(diǎn)放在參數(shù)value上,大家都清楚value可以是值類型,也可以是函數(shù),對(duì)于值類型來(lái)說(shuō),不用考慮其他東西直接賦值就可以了,對(duì)于函數(shù)來(lái)說(shuō)就沒(méi)有這么簡(jiǎn)單,它支持兩種操作:

1、直接將函數(shù)賦給新擴(kuò)展的屬性;

2、將函數(shù)執(zhí)行的返回值賦給新擴(kuò)展的屬性。

 
 
 
 
  1. function dym_setprop(obj, key, value, fn, exec, pass) {
  2.     if (obj && key) {
  3.   var temp = value;
  4.   if (exec) {
  5. temp = value.call(obj, key, fn(obj, key));
  6.   }
  7.   fn(obj, key, temp, pass);
  8.     }
  9. }

在這段代碼中參數(shù)exec充當(dāng)了上面兩種操作選擇的角色,參數(shù)pass是一個(gè)額外的執(zhí)行參數(shù)。除此之外,大家也許會(huì)對(duì)fn有些疑惑,因?yàn)樯厦嬗袃蓚€(gè)地方使用了,區(qū)別只有參數(shù)個(gè)數(shù)不同,fn到底代表什么?!再次想下C#中的屬性,它是有Get/Set的,那么在這里fn(obj,key)就相當(dāng)與Get,而fn(obj,key,temp,pass)就相當(dāng)與Set。例如:看下面的代碼,對(duì)于fn的定義與使用,

 
 
 
 
  1. employee.AccessProp = function(obj, key, value) {
  2.     if (value) {
  3.   obj[key] = value;
  4.     }
  5.     else {
  6.   return obj[key];
  7.     }
  8. }
  9. dym_setprop(empObj, "age", function(key, value) { return value + 10; }, employee.AccessProp, true);

看了這么多,也許大家覺(jué)得郁悶,簡(jiǎn)單的動(dòng)態(tài)擴(kuò)展對(duì)象程序?yàn)槭裁匆赃@種方式來(lái)編寫,有種沒(méi)事找事的感覺(jué),其實(shí)不然,如果你只想做動(dòng)態(tài)擴(kuò)展對(duì)象,那么我建議你別采用上述dym_setprop的思路,但是如果你想從更加抽象的角度上思考,將dym_setprop內(nèi)的程序作為一個(gè)流程執(zhí)行的模板,那么這是一個(gè)不錯(cuò)的方式,因?yàn)閐ym_setprop內(nèi)部不承擔(dān)任何具體代碼(obj[key]=value或obj[key])的執(zhí)行,它都通過(guò)函數(shù)fn來(lái)代替,這樣對(duì)于具體執(zhí)行來(lái)說(shuō)有完全自由的空間。理解完上述的思路后,讓我們進(jìn)入本文的核心,jQuery是如何實(shí)現(xiàn)動(dòng)態(tài)擴(kuò)展對(duì)象的?access函數(shù),

 
 
 
 
  1. function access( elems, key, value, exec, fn, pass ) {
  2.     var length = elems.length;
  3.     
  4.     // Setting many attributes
  5.     if ( typeof key === "object" ) {
  6.   for ( var k in key ) {
  7. access( elems, k, key[k], exec, fn, value );
  8.   }
  9.   return elems;
  10.     }
  11.     
  12.     // Setting one attribute
  13.     if ( value !== undefined ) {
  14.   // Optionally, function values get executed if exec is true
  15.   exec = !pass && exec && jQuery.isFunction(value);
  16.   
  17.   for ( var i = 0; i < length; i++ ) {
  18. fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
  19.   }
  20.   
  21.   return elems;
  22.     }
  23.     
  24.     // Getting an attribute
  25.     return length ? fn( elems[0], key ) : null;
  26. }

仔細(xì)看完access函數(shù)的代碼,你一定發(fā)現(xiàn)它和dym_setprop的相試度很高,它只是多了一段代碼:

 
 
 
 
  1. if ( typeof key === "object" ) {
  2.    for ( var k in key ) {
  3.     access( elems, k, key[k], exec, fn, value );
  4.    }
  5.    return elems;
  6. }

很容易看出它其實(shí)就是用來(lái)支持object對(duì)象的動(dòng)態(tài)擴(kuò)展屬性。具體的執(zhí)行流程通過(guò)下圖來(lái)展示:

到這里已經(jīng)寫完了,本文試著從自己的角度上去猜測(cè)jQuery的開發(fā)者是如何設(shè)計(jì)出access函數(shù)的,讓它去支持動(dòng)態(tài)擴(kuò)展對(duì)象,并且說(shuō)明了access的執(zhí)行流程。其實(shí)對(duì)于我的這種猜測(cè)不一定正確,不過(guò)不妨礙我對(duì)于jQuery的研究。

文章轉(zhuǎn)自Kevin-moon的博客,

原文地址:http://www.cnblogs.com/Kevin-moon/archive/2010/05/24/1742693.html


網(wǎng)站題目:jQuery另類視角:動(dòng)態(tài)擴(kuò)展對(duì)象
瀏覽地址:http://www.5511xx.com/article/cohdeph.html