成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

jQuery另類視角:動態擴展對象

開發 開發工具
本文試著從個人的角度上去猜測jQuery的開發者是如何設計出access函數的,讓它去支持動態擴展對象,并且說明了access的執行流程,盡管這種猜測不一定正確,

大家都知道Javascript是動態語言,它對動態的支持是與身俱來的,jQuery作為Javascript最為流行的框架之一,同樣有著這樣的特性。文章將從個人的角度出發,研究jQuery的開發者是如何設計出access函數,并讓它去支持動態擴展對象。

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

例如:有一個employee對象:

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

現在需要為它動態的新增"age"屬性和"toString()"方法:

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

一行簡單的代碼就承擔了這項工作,這是Javascript內置支持的,不過往往我們需要在這基礎上支持一定程度的擴展,所以會將這一行簡單的代碼抽成一個方法:

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

看到這里,我們先讓思路做個跳轉,跳到C#中的employee對象,如下:

C#中的employee對象

在面向對象的編程中,對外使用的都是屬性(Get/Set),那么想想如何將這種方式簽入到Javascript中,現在讓我們跳回dym_setprop函數內,既在dym_setprop方法中不能使用obj[key]=value的直接賦值方式,而要支持Set。

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

參數fn,在dym_setprop中不直接操作任何對象,使用函數fn來代替相應的操作代碼,則在這里除了支持Set外,還有其他很大的自由空間。讓我們繼續深入dym_setprop方法,現在我們把關注點放在參數value上,大家都清楚value可以是值類型,也可以是函數,對于值類型來說,不用考慮其他東西直接賦值就可以了,對于函數來說就沒有這么簡單,它支持兩種操作:

1、直接將函數賦給新擴展的屬性;

2、將函數執行的返回值賦給新擴展的屬性。

  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.     }  

在這段代碼中參數exec充當了上面兩種操作選擇的角色,參數pass是一個額外的執行參數。除此之外,大家也許會對fn有些疑惑,因為上面有兩個地方使用了,區別只有參數個數不同,fn到底代表什么?!再次想下C#中的屬性,它是有Get/Set的,那么在這里fn(obj,key)就相當與Get,而fn(obj,key,temp,pass)就相當與Set。例如:看下面的代碼,對于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); 

看了這么多,也許大家覺得郁悶,簡單的動態擴展對象程序為什么要以這種方式來編寫,有種沒事找事的感覺,其實不然,如果你只想做動態擴展對象,那么我建議你別采用上述dym_setprop的思路,但是如果你想從更加抽象的角度上思考,將dym_setprop內的程序作為一個流程執行的模板,那么這是一個不錯的方式,因為dym_setprop內部不承擔任何具體代碼(obj[key]=value或obj[key])的執行,它都通過函數fn來代替,這樣對于具體執行來說有完全自由的空間。理解完上述的思路后,讓我們進入本文的核心,jQuery是如何實現動態擴展對象的?access函數,

  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;  

仔細看完access函數的代碼,你一定發現它和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;  

很容易看出它其實就是用來支持object對象的動態擴展屬性。具體的執行流程通過下圖來展示:

執行流程圖

到這里已經寫完了,本文試著從自己的角度上去猜測jQuery的開發者是如何設計出access函數的,讓它去支持動態擴展對象,并且說明了access的執行流程。其實對于我的這種猜測不一定正確,不過不妨礙我對于jQuery的研究。

文章轉自Kevin-moon的博客,

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

【編輯推薦】

  1. 5種方法教你用jQuery重寫表單驗證
  2. 你應該學習jQuery的七大理由
  3. 了解jQuery技巧來提高你的代碼質量
  4. 10個自由豐富的jQuery或JavaScript編輯器
  5. 闡述jQuery工具函數的使用和解決方案
責任編輯:王曉東 來源: 博客園
相關推薦

2011-12-29 09:24:54

iOS應用下載排行榜

2009-09-09 16:06:08

對象

2020-03-10 18:53:16

移動支付另類支付APP

2012-06-15 17:50:26

2015-09-24 08:55:14

Java動態代理擴展

2015-09-24 08:54:36

java動態代理

2013-12-02 14:18:33

jQuery對象

2015-03-13 09:30:23

iOS內存管理

2010-04-21 09:26:54

Java動態代理

2021-06-30 09:40:31

MySQL數據庫Java

2025-04-10 07:30:43

2023-09-07 14:03:41

5GXR

2024-08-14 13:24:24

2012-02-07 10:05:40

jQuery MobijQuery Mobi

2011-08-22 16:19:58

jQuery

2015-08-18 13:25:12

PaaS服務架構動態擴展

2009-11-25 10:16:49

linuxphpizePHP

2009-09-03 17:18:40

C#擴展性對象模型

2010-11-23 11:16:35

MySQL表別名

2009-10-23 17:10:27

試用達人
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久久久9999鸭 | 在线观看亚洲精品视频 | 中文字幕视频在线 | 日韩欧美国产一区二区 | 久久久久久久久久久久久久av | 免费成人在线网站 | 国产一二区免费视频 | 九色 在线 | 国内精品免费久久久久软件老师 | 不卡一区二区三区四区 | 国产精品福利网 | 国产二区精品视频 | 国产成人精品视频 | 欧美videosex性极品hd | 久久99精品久久久97夜夜嗨 | 成人免费区一区二区三区 | 欧美成人a∨高清免费观看 91伊人 | 亚洲一区二区在线视频 | 波多野结衣先锋影音 | 日韩一区二区三区在线视频 | 国产一级特黄真人毛片 | 亚洲成人中文字幕 | 午夜羞羞 | 成人免费观看视频 | 久久aⅴ乱码一区二区三区 91综合网 | 亚洲一二三区不卡 | 草草影院ccyy| 国产二区av | 丝袜 亚洲 另类 欧美 综合 | 日韩专区中文字幕 | 国产精品99久久久久久久久久久久 | 91在线一区二区三区 | 在线a视频网站 | 成人深夜福利网站 | www.99re| 国产精品视频免费观看 | 欧州一区 | 羞羞在线观看视频 | 国产欧美日韩在线播放 | 日韩视频观看 | eeuss国产一区二区三区四区 |