精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

JavaScript對象及繼承教程之內置對象

開發 前端
在 JavaScript 世界里,關于面向對象第一個要澄清的概念就是類。對象都是有類來定義的,通過類來創建對象就是我們所熟悉的實例化。然而,在 JavaScript 中別沒有真正的類,對象的定義就是對象自身。

一、 類與對象

在 JavaScript 世界里,關于面向對象***個要澄清的概念就是類。對象都是有類來定義的,通過類來創建對象就是我們所熟悉的實例化。然而,在 JavaScript 中別沒有真正的類,對象的定義就是對象自身。而 ECMA-262 干脆把這種妥協的方式稱作為對象的調和劑。為了方便理解,我通常把這個發揮類的作用的調和劑稱為類。

二、 內置對象

1、 Array類

數組在 js 中是非常常用的一種數據結構,由于其靈活性和易用性,合理的使用數組可以幫助我們更好的實現相應的功能。

讓我們先看 Array 對象的創建吧

***種:

  1. var arr = new Array(10);  

該方法在實際的使用當中并不那么的實用,與很多編譯型語言不同, js 數組的長度是可變的,不但增強了靈活性,還給我們有了更多好的選擇。

第二種:

  1. var arr = new Array("one","two","three");  

使用 new 方式創建數組的方法一般多為這兩者,當然也可以使用 new Array() 創建一個空的數組對象。通常情況下,我推薦如下的方法

第三種:

  1. var arr = ["one","two","three"];  

使用數組的字面量方式創建一個數組對象,不但簡潔易讀,而且幾乎完全等價于使用 new 方式創建數組對象的效果。數組對象有很多好用的方法,接下來我們就一起看看這個數組對象的強大功能吧。

首先要介紹的是 push 方法,學過數據結構的朋友都知道 push 意味著什么,沒錯,他的出現讓數組能夠實現棧的數據結構(同時需要配合 pop 方法)。 push 方法幫助我們緊湊的添加數組元素。前面提到js中的數組是長度是可變的,則我們可以添加元素。既然可以通過 arr[length] = newValue; 來給 arr 添加一個新元素并放置于數組尾。更好的辦法就是使用 push 方法。 arr.push(newValue); 怎么樣,使用他比你還要通過數組長度來賦新值方便多了吧。在這里有一點需要注意。請看下面的代碼:

  1. var arr = [];   
  2. arr[4] = 5;   
  3. alert(arr.length == 5);   
  4. alert(arr); //alert : ,,,,5  

當我們需要給指定數組位置賦予指定的值的時候,這種賦值就顯得十分有用了,比如在用于裝箱排序的時候。

pop 方法則是實現與 push 相反的作用,返回數組的***一個元素,并出棧。

  1. var arr = [1,2,3,4,5];   
  2. var ele = arr.pop();   
  3. alert(ele == 5);   
  4. alert(arr.length == 4); 

數組對象的 toString 和 valueOf 方法比較人性化的重寫了,它的實現是把每一項都調用 toString 方法,然后用半角逗號(,)連接每一項。那么:

  1. var arr = [1,2,3,4,5];   
  2. alert(arr);//output:1,2,3,4,5   

toLocaleString 方法在這里不做詳細說明了,他的效果與 toString 方法類似,只是每項調用 toLocateString 方法。

如果你想使用個性化的分隔符來顯示數組元素,那么 join 方法可能會更加的適合。比如:

  1. var city = ["上海","北京","天津","重慶","深圳"];   
  2. alert(city.join("|"));//output:上海|北京|天津|重慶|深圳   

由此可見 join 是把數組元素轉換為一個字符串。在介紹字符串的時候我們將再次看到 join 方法的使用。

concat 方法和 slice 方法是又一對好用的方法,這兩個方法的特殊之處在于 String 對象也擁有他們。當我們希望給一個數組添加多個數組元素的時候,使用 push 可能就顯得有些冗余和復雜了,而且也會讓 coding 變得不那么有意思了。好在我們有 concat 方法,該方法將其參數們按序加入數組元素中。如:

  1. var arr = [1,2,3,4,5];   
  2. arr = arr.concat(6,7,8,9);   
  3. alert(arr.length == 9);    

注意, concat 并不修改數組對象本身,而是將數組元素與 concat 方法的數組元素合并后返回。所以需要給數組元素進行賦值運算才行。

slice 方法則是從數組對象中返回一個子數組。該子數組是從 slice 方法的***個參數所指位置至第二個參數所指的位置。這是一個半開半閉區間 [a,b) 。如:

  1. var arr = [1,2,3,4,5];   
  2. var arr1 = arr.slice(1,3);   
  3. alert(arr1); //output:2,3   
  4. alert(arr); //output:1,2,3,4,5 

好了, slice 和 concat 方法一樣不是修改數組對象本身。同時參數1,3表示從位置1到位置3的半開半閉區間的子數組。

剛才討論了后進先出的棧操作,現在我們來看看先進先出的隊列操作吧。進列使用 push 方法沒有問題,那么出列呢。是 shift ,他刪除數組對象的***個元素并返回:

  1. var arr = [1,2,3,4,5];   
  2. var ele = arr.shift();   
  3. alert(ele); //output:1   
  4. alert(arr.length);//output:4 

另外一個還有一個方法,叫 unshift ,他將新元素插入數組對象的***項,究其功能與 shift 是相反的操作。

sort 方法很靈活,使用好了,他可以給數組元素以任意你想要的排序方式來進行排序。因為 sort 方法接收一個匿名函數(其實,它同樣可以接收一個非匿名的函數,但是通常不推薦為此而創建一個這樣的命名函數,除非該函數可重用)作為自己的排序的條件。比如:

  1. Object.prototype.toString = function(){   
  2. var str = '';   
  3. for(var item in this) {   
  4. str += item + ":" + this[item] + ",";   
  5. }   
  6. return str.length?str.substr(0,str.length-1):str;   
  7. };   
  8. var arr = [{key:3,value:"three"},  
  9. {key:1,value:"one"},{key:2,value:"two"}];   
  10. arr.sort(function(a,b){   
  11. return a.key - b.key;   
  12. });   
  13. alert(arr);  
  14. //output:key:1,value:one,key:2,value:two,key:3,value:three   

我們先不去糾結 Object.prototype.toString 方法,他的左右就是將對象遍歷使之可以輸出為鍵值對格式字符串,在介紹原型鏈的時候會再次提到。我們可以看到 sort 方法通過這個匿名方法讓我們可以根據 key 屬性來進行排序。那就讓我們來看看這個匿名方法吧。

  1. function(a,b) {   
  2. return a.key - b.key;   
  3. };   

可以看到,這個方法接收2個參數,然后對參數的自身或某個屬性進行比較,然后返回比較結果,他們的比較結果與排序對應關系如下:

如果 paramA - paramB > 0,return 正數 ,則 b 排在 a 的前面

如果 paramA - paramB < 0,return 負數 ,則 b 排在 a 的后面

如果 paramA - paramB = 0,return 0 ,則順序不變。

上面的實現是順序排序,那么 倒序 呢?對, return paramB - paramA;

reverse 方法可以將數組對象反轉。他和 sort 方法一樣是修改數組對象內部元素順序的。

***我們看看 splice 方法,他是替換和刪除數組對象元素的方法。根據參數的改變而擁有不同的實現結果。 splice(pos,count[,insertParams]);pos 參數是刪除元素的***個項的位置, count 參數是刪除元素的個數,當為0時則不刪除(不刪除還要這個方法干嘛,別著急,往下看), insertParams 則是參數列表,這些參數是即將插入的元素集合。插入的位置為 pos 。那么就出現了以下幾種情況了。

   1、 insertParams 忽略時,該方法就是刪除數組元素

   2、 當 count 參數為0時,該方法將只是將 insertParams 插入到 pos 位置

   3、 當 count 參數不為0且 insertParams 不忽略時,該方法就是刪除 pos 位置開始的 count 個元素,并替換 insertParams 參數集合。

2、 Math類

我們花了很大的篇幅來介紹數組類,我要再次強調一點,這個類只是為了介紹方便強加于它的一個名字,實際上他們也只是對象。而非真正的類。

Math 類的使用范圍相對狹窄,因為他作為一個數學計算的類,而非一個數據結構類,但是我們也看到了 Math.random 以及各種取整等常用方法。因此我們不妨花些時間來看看他們,但是如果你對此興趣不大,那么看完 random 方法之后就可以跳到下一節去,以后用到的時候再翻手冊就可以了。

Math 通常是一個“靜態”類,因為沒有人會實例化一個 Math 對象,而是直接使用其“靜態”方法,有些資料直接稱它為 Math 對象,在這里我們不妨稱它為“靜態”類吧。

首先我必須介紹 random 方法,因為他常用且太有用了。在制造隨機事件的時候他總是不可或缺,同樣在防止緩存上他也顯得很有用處。 Math.random 方法返回的是一個 0到1 之間的開區間浮點數,即 (0,1) ,他的使用非常簡單,唯一需要注意的是,當我們取整的時候對 floor 和 ceil 方法的篩選時需要謹慎,前者使得 random 間接轉換為前閉后開區間,而后者則是前開后閉區間。假如我們現在需要一個取1-100的隨機數,那么有如下的兩種常用解決方案

方法一:

  1. Math.ceil(Math.random*100);  

方法二:

  1. Math.floor(Math.random*100)+1;  

ceil 方法和 floor 方法都是用來取整的數學方法,根據單詞含義我們可以理解,前者是向上取整,而后者則是向下取整。

當我們從一個連續的數組對象中隨機選擇一個數組元素時,我們可以借助 random 輕松的來幫我們挑選:

  1. ["ipad","iphone","ipod touch","ipod nano","macbook"]  
  2. [Math.ceil(Math.random()*4)]; 

這個例子中,我直接使用的是數組字面量,一開始你可能會覺得費解或者不易理解,當你深入以后你會發現原來 JavaScript 是如此的方便、簡潔、靈活。

前面我們介紹了 ceil 和 floor 方法的取整,那么當我們想要接近舍入時呢,我們可以使用 Math.round 方法,他在取整時根據數值進行靠近取整。比如 Math.round(5.4) 返回的是 5 。那么如果 Math.round(5.5) 呢,答案是 6 而不是 5 。關于這點需要有所了解。好吧我承認我較真了,但是知道了他有什么壞處呢。

當我們想從 2 個數中取得較小或者較大的數的時候怎么做呢?

  1. if(a>b) {   
  2. return a;   
  3. else {   
  4. return b;   
  5. }   

我們多慮了。 Math 提供了 Math.max 和 Math.min 方法來幫助我們解決這個問題。

Math 還有一大堆的“靜態”方法和屬性。在這里我就不一一列舉了,當我們要進行數學計算的時候不妨去查查手冊。

3、 String類

字符串對象的使用頻率恐怕比數組對象有過之而無不及,為什么我要放到后面來說呢,其實是因為對于字符串,我們要說的更多,而可擴展的方法和工具函數也更加豐富。我們一起先來看看 String 類本身吧。

創建一個字符串對象有以下幾種方法:

方法一:

  1. var str = new String("Hello World");  

方法二:

  1. var str = String("Hello World");  

方法三:

  1. var str = "Hello World";  

和數組對象一樣,我推薦大家使用***一種方法,及字符串字面量。關于是否有 new 的區別,周愛民老師的博客中有過很詳細的解釋,同時,如果你一直讀下去,在介紹自定義對象的時候也會提到 new 運算符。

String 對象有且只有一個屬性 length ,他返回字符串的長度,在這里我們必須要弄明白 JavaScript 是 unicode 編碼,那么漢字和英文都當作一個字符長度來處理,之所以提到這個是因為曾經遇到不止一位朋友在論壇提問這個問題,呵呵,動手的必要性啊。那么如果我們非要把漢字當作 2 個字符長度來計算呢?這就帶來了我們***個自定義方法。

  1. String.prototype.getLength = function(isSplit){   
  2. if(isSplit) {   
  3. return this.replace(/[^\u0000-\u00FF]/g,"tt").length;   
  4. }    
  5. else {   
  6. return this.length;   
  7. }   
  8. };  

該方法通過傳遞一個 Boolean 類型的參數,如果為真則將非半角字符、數字、英文字母分割為 2 個長度來求長度,不用擔心這個分割,他并不會修改字符串對象本身。如果為假,則直接返回 length 屬性值。由于介紹方法不是根據方法的字符排列順序而來,如果作為字典,我想還是 w3school 更合適,因為我是根據作用的不同和關聯性來進行介紹。 ok ,介紹完了 length 屬性,我們看看字符串查找吧。

#p#

indexOf 和 lastIndexOf 方法。

這兩個方法從是從字符串中查找一個字符或字符子串,區別在于查找方向,前者是從位置 0 處開始查找,并返回***個查找到的位置,后者從位置 length-1 處開始查找,并返回***個查找到的位置。如果查找不到呢,返回 -1 。例如

  1. var str = "了解面向對象編程和基于對象編程是一個基礎理論";   
  2. alert(str.indexOf("對象")); //output:4   
  3. alert(str.lastIndexOf("對象"));//output:11   
  4. alert(str.indexOf("過程"));//output:-1   

從輸出的結果我可以得到以下結論:

1、 字符位置是從 0 開始索引

2、 即使是從后往前查找,返回位置時也還是位置 0 開始計算

3、 當在字符串中索引不到該子串時,返回 -1 值。

charAt 和 charCodeAt 方法根據一個位置索引來返回字符,其中前者是返回字符本身,后者返回字符編碼。我們簡單的看個例子后結束他們:

  1. var str = "了解面向對象編程和基于對象編程是一個基礎理論";   
  2. alert(str.charAt(5)); //output:象   
  3. alert(str.charCodeAt(5));//output:35937  

接下來輪到 slice , substr 和 substring 方法,說實話很多熟悉 JavaScript 的程序員也經常會混淆兩者的用法,并非是我夸張,而是 substring 和很多后臺語言的 substring 方法區別很大的哦。先看看 slice 方法。

slice(start[,end]) 方法需要提供至少一個整數參數,作用是返回從 start 的位置開始到 end 位置的字符子串。接下來幾句話請仔細看清楚了,以防造成曲解,當參數 start 為負數的時候他將從字符串尾部開始計算,當 end 沒有指定時, end 即為字符串的結尾。如果為負數呢,他也要從字符串尾部開始計算。所以當我們需要一個字符串的之后 3 個字符時只需 slice(-3); 由此可見,合理的使用負數讓我們的程序變得簡單。但是在此之前,請確保自己了解了他的作用。

據我所知的編程語言中,有很大一部分的 substring 方法設計為 substring(beginposition,length) ,而在 JavaScript 中正好也有這么一個方法,可惜真正與之對應的是 substr 方法。 substr(pos[,length]) 方法中,如果 pos 為負數,則與 slice 的負數解釋相同, length 省略時與 slice 的 end 省略也相同。

到了 substring 方法, substring(from[,to]); 從定義上就可以看到,后一個參數是一個位置,而非長度,因此他更像 slice ,但是與之有一點重要的區別,那就是 substring 方法不包含 to 位置。即是一個半開半閉區間。另一個區別是 substring 不支持負向位置,如果***個參數為負數,那么就是從位置 0 開始。后一個位置如果是負數,則返回空串,如果第二個參數小于***個參數,那么同樣返回空串,但是如果相等呢,還是空串,因為這是一個半開半閉區間 [from,to) 。

另外幾個查找的方法 :match 、 search 將在后面介紹正則表達式和 RegExp 類的時候詳細介紹。替換方法 replace 也將在介紹正則表達式時介紹。另外一對有用的方法是 toLowerCase 和 toUpperCase 。他們就是將字符串進行大小寫轉換的。

字符串操作的另一個領悟的連接字符串。字符串對象是長度不可變的,仔細回顧下之前所有的方法中沒有一個是修改對象本身的方法。關于這點將于稍后一個思考題單獨會展開來介紹。現在你要做的就是知道這點。字符串對象的連接方法常見的三種,***種是使用 concat 方法,在介紹 Array 類的時候我們也見過這個方法,他們其實是一樣的東西,連接字符串為一個新串,另外字符串對象重載了 + 號運算符,用來簡化連接操作,因此 "abc"+"de" == "abcde"; 還有一個方法是借助 Array 對象中的 push 和 join 方法連接字符串。

  1. var arr = [];   
  2. for(var i = 0; i < 10; i++) {   
  3. arr.push("<img alt=\"test\" src=\"pic" + i + ".jpg\" />");   
  4. }   
  5. arr = arr.join("");   

這種方法很類似與 C# 中的 StringBuilder 的 append 和 ToString 方法,而好處也很類似。不要忘了在 join 的方法中加上參數""哦,否則的話,多出的逗號可能就有點事與愿違了。為了方便操作,我們通常還會擴展一個方法來模擬 printf(in c) 和 format(in c#):

  1. function formatString()  {   
  2. var args = arguments;   
  3. if(args.length > 1) {   
  4. return args[0].replace(new RegExp  
  5. ("\{([0-" + (args.length-2).toString() + "])\}","g"),function(s,m){   
  6. return args[+m+1];   
  7. });   
  8. }   
  9. }  

首先我要說明,這個方法與原來的方法相比丑陋了許多,但是更容易理解,其次,這個方法有自身的 bug 存在,即當參數過多(>10)時,正則表達式將不能正確運轉。因此我們換個解決方案來解決這個 bug (感謝zswang 的仔細,下面的解決方案也是仿照zswang的。)

  1. function formatString(str,params) {   
  2. return str.replace(/\{(\d+)\}/g,function(s,m){   
  3. return params[+m];   
  4. });   
  5. }   
  6. alert(formatString("{0} is {1} old",['JeeChang',25])); 

JavaScript 中沒有一個 trim 方法,讓我們很是苦惱,沒有例外,我們自己寫一個 trim 方法吧

  1. String.prototype.trim = function(which){   
  2. var pattern = {   
  3. "left":"^\\s*",   
  4. "right":"\\s*$",   
  5. "both":"^\\s*|\\s*$"   
  6. }   
  7. return this.replace(new RegExp(pattern[which],'g'),"");   
  8. };  

字符串的操作一直都不僅限于此,比如字符串截取往往還有這樣的需求,即我們在瀏覽器顯示的時候往往需要根據全半角來截斷字符串,但是***一個字符是全角的話則需要全部截斷。看上去一定很復雜吧。沒關系我們來添加這個方法。

  1. String.prototype.splitCount = function(count){   
  2. var str = this;   
  3. var signs =   
  4. ['~','!','|','`',':','$','#','&','*','@','.','?'];   
  5. var sign = '';   
  6. for(var i = 0; i < signs.length; i++) {   
  7. if(str.indexOf(signs[i]) < 0) {   
  8. sign = signs[i];   
  9. break;   
  10. }   
  11. }   
  12. str = str.replace(/[^\u0000-\u00FF]/g,sign + sign);   
  13. var ig = count;   
  14. for(var i = 0; i < count; i++) {   
  15. if(str[i] == sign)   
  16. ig-=0.5;   
  17. }   
  18. return this.substr(0,Math.floor(ig));   
  19. };  

這個方法很可惜,替換字符不夠全面,如果恰巧這些字符都存在于其中,那么結果就很可悲了。所以這個方法不是那么的可靠。其實可以通過初步判斷總字符長度來截取掉后面的字符串然后再查找是否有替換字符。這樣概率就相對小些。

介紹完了數組對象和字符串對象之后,我們看下面一個例子:

  1. var a = "abc";   
  2. var b = "abc";   
  3. alert(a.valueOf() === b.valueOf);   
  4. alert(a.toString() === b.toString());   
  5. alert(a.valueOf() == b.valueOf());   
  6. var arr1 = ['a','b','c'];   
  7. var arr2 = ['a','b','c'];   
  8. alert(arr1.toString() === arr2.toString());   
  9. alert(arr1.valueOf() === arr2.valueOf());   

請問輸出結果是什么呢?

4、 Date類

日期類恐怕是我見過最無奈的JavaScript內置類(對象)。因為他的瀏覽器不同表現,時間日期的操作處理都顯得那么的不友好。幸好,JavaScript固有的機制可以讓我們自己來解決這些問題。不過在此之前我們還是先大致了解下他的一些方法和屬性。

創建一個日期對象可以有這些方法

方法一:

  1. var d = new Date(ms);//ms代表從1970.1.1凌晨0點的毫秒數  

方法二:

  1. var d = new Date(year,month[,day,hour,minute,second,millisecond]); 

方法三:

  1. var d = new Date("localDateString");//這里不是那么的通用。2011/5/5格式相對通用 

如果我們需要創建一個當前時間的日期對象。直接new Date()用無參數的構造函數即可。當然我們不能忽略這個new,前面提到String和Array可以省略,然而這里千萬不能這樣做。因為Date()的結果是瀏覽器實現的一個日期對象的toString返回的表示日期的字符串。故此,這里兩者不能混用。

日期對象的方法大致分為獲取和設置日期時間的某一(幾)個部分。獲取方法相對好用一些,然后設置方法則顯得不那么夠用。這里有幾個需要拿出來先說說。

getDate/setDate。該方法操作的是天數,而非日期值。這個還是有點不大直觀的。

getDay/setDay。該方法操作的是周數,序數從0開始,即周日的值是0。

getMonth/setMonth。該方法操作的是月數沒有疑問,但是月數是從0開始。

getFullYear/setFullYear。我通常建議用這組方法來代替直觀的getYear/setYear。

toDateString/toTimeString==輸出日期的方法。但是并不是那么的好用。

接下來,讓我們一步一步來打造更適合自己的一套方法。

首先,我們來格式化輸出

  1. var conf = {   
  2. syslang : "cn" //設置系統語言   
  3. };   
  4. Date.prototype.toFormatString = function(format) {   
  5. var weeks = {};   
  6. weeks['cn'] = ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'];   
  7. weeks['en'] =   
  8. ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];   
  9. var self = this;   
  10. var fix = {   
  11. 'yyyy':self.getFullYear(),   
  12. 'MM':self.getMonth()+1,   
  13. 'dd':self.getDate(),   
  14. 'wk':weeks[conf.syslang][self.getDay()],   
  15. 'hh':self.getHours(),   
  16. 'min':self.getMinutes(),   
  17. 'ss':self.getSeconds()   
  18. };   
  19. return format.replace(/[a-zA-Z]+/g,function(m){   
  20. return fix[m];   
  21. });   
  22. }; 

嗯,這個方法多了個全局的配置對象,但是這個不是必須的,只是在這里提示大家如果實現個性化定制,但是如果是自己的項目使用,我更建議減少代碼(把en或cn去掉)來打造適合自己項目的精簡代碼。該方法的使用一目了然,在這里也不多解釋了。

接下來是日期的操作,***組是日期的加減。熟悉.net的朋友都知道AddXXX的一組方法,因此我們也可以打造一組這樣的代碼,在此我只列舉一個,有需要的可以自己實現其他的。其實這套方法可以使用偽泛型的方式將Add方法組并到一個方法。但是我更愿意用一目了然的方法名來提供。

  1. Date.prototype.addMonth = function(n){   
  2. var month = this.getMonth();   
  3. this.setMonth(month+n);   
  4. };   
  5.  

怎么樣,很簡單吧。不用擔心溢出(13月)或者負月份(-1月)會造成什么不良后果,日期對象會自己為了通過調整年數來得到合適的結果。

接下來是日期比較。純粹的日期比較不是問題,因為getTime獲取毫秒數之后進行加減操作即可。然而如果要是比較相差的天數怎么辦呢。其實也簡單。那就是相差的毫秒數換算到天數即可

  1. Date.prototype.compareTime = function(time) {   
  2. var ticks = time.getTime() - this.getTime();   
  3. return Math.floor(ticks/(1000*60*60*24));   
  4. }   

至于比較周數同理,但是月數和年數呢?對不起,考慮到閏年和大小月等問題,這個方法比較復雜,在這里就不貼出來了,如果您有興趣不妨嘗試著自己寫寫看。

原文鏈接:http://blog.csdn.net/cj205/archive/2011/01/23/6159709.aspx

【編輯推薦】

  1. JavaScript內存回收機制深入解讀
  2. JavaScript懶加載技術(lazyload)簡單實現
  3. 寫了10年Javascript未必全了解的連續賦值運算
  4. JavaScript初學者應注意的七個細節
  5. Web開發者必知 31個最實用的Javascript工具(附下載)
責任編輯:陳貽新 來源: 常健的博客
相關推薦

2012-07-25 13:25:11

ibmdw

2011-05-25 10:59:26

Javascript繼承

2011-05-25 11:15:02

Javascript繼承

2010-10-08 09:13:15

oop模式JavaScript

2017-05-31 14:03:07

Java多線程內置鎖與顯示鎖

2017-05-08 11:46:15

Java多線程

2016-11-07 15:43:38

JavaScript

2011-07-08 10:25:55

JavaScript

2010-10-08 10:52:36

JavaScript對

2023-10-11 13:13:46

?PostmanJavaScrip

2018-12-14 11:30:00

JavaScript編程前端

2023-09-27 23:28:28

Python編程

2009-10-21 18:09:12

VB入門教程

2009-01-04 09:08:30

面向對象繼承接口

2010-01-06 10:58:06

建立JavaScrip

2021-05-14 00:00:15

JavaScript開發代碼

2010-03-05 14:44:36

Python繼承

2017-04-21 09:07:39

JavaScript對象編程

2021-04-07 10:12:05

Javascript對象拷貝開發

2010-10-08 10:26:45

JavaScript內
點贊
收藏

51CTO技術棧公眾號

深田咏美中文字幕| 欧美精彩一区二区三区| 一级免费黄色录像| 视频精品二区| 一本色道a无线码一区v| 艳色歌舞团一区二区三区| 亚洲av无码国产精品久久不卡| 亚洲国产婷婷| 日韩中文在线视频| 超碰caoprom| 久久三级毛片| 亚洲18色成人| 99久久久无码国产精品性色戒| 五月激情婷婷网| 精品一区二区在线观看| 午夜精品一区二区三区在线视频| 国产又粗又猛又爽又黄av| 久久伦理中文字幕| 色av综合在线| 国产手机免费视频| 日本在线观看| 久久久久久免费网| 国产成人精品一区二区三区福利| 欧美性受xxx黑人xyx性爽| 亚洲天堂激情| 麻豆乱码国产一区二区三区 | 成人三级高清视频在线看| 国产精品妹子av| 蜜桃传媒视频麻豆一区| 性生活视频软件| 国产又粗又猛又爽又黄91精品| 国产成人97精品免费看片| 久久一区二区三| 久久精品欧美一区| 亚洲欧美综合另类中字| 中文字幕人妻一区二区三区| 精品欧美视频| 在线不卡a资源高清| 农村妇女精品一二区| 超碰在线最新网址| 一区二区三区av电影 | 国产夫妻性爱视频| 在线播放一区二区精品视频| 欧美另类高清zo欧美| 免费男同深夜夜行网站| 伊伊综合在线| 一本大道av一区二区在线播放| 亚洲熟妇无码一区二区三区| 天天干在线视频论坛| 亚洲你懂的在线视频| 亚洲午夜精品国产| 欧美成人精品一区二区男人看| 国产亚洲一区二区三区| 欧美日韩精品久久| 久草视频视频在线播放| 国产亚洲午夜高清国产拍精品| 鲁丝片一区二区三区| 你懂的免费在线观看| 久久老女人爱爱| 日本一区视频在线观看| 国产综合在线观看| 欧美激情一二三区| 日韩欧美视频一区二区三区四区| 免费播放片a高清在线观看| 91视频91自| 欧美精品亚洲| 春暖花开成人亚洲区| 欧美国产精品专区| gogogo免费高清日本写真| 免费在线看黄网站| 亚洲精品国产一区二区精华液 | 50度灰在线| 亚洲综合另类小说| 久久国产精品网| 这里有精品可以观看| 色狠狠色狠狠综合| 在线免费看污网站| 日韩视频一区二区三区四区| 精品国精品自拍自在线| 丰满少妇一区二区三区| 精品国产一区二区三区香蕉沈先生 | 亚洲国产日韩欧美在线观看| 爱情电影网av一区二区| 日韩欧美123| 国产黑丝一区二区| 国产一区二区三区探花| 日韩中文在线中文网三级| 国产精品成人免费观看| 国产亚洲欧洲| 国产日韩欧美在线看| 亚洲av无码国产精品永久一区| 不卡的av在线| 亚洲国产欧美不卡在线观看 | 亚洲男人的天堂在线aⅴ视频| 国产一区二区片| www.精品| 日韩欧美亚洲国产精品字幕久久久 | 综合视频在线观看| 理论不卡电影大全神| 欧美视频在线观看一区| zjzjzjzjzj亚洲女人| 免费成人结看片| 久久精品中文字幕| 一级黄色免费网站| 国产成人免费在线| 日韩国产美国| 波多野结衣中文在线| 欧美视频中文字幕| 538国产视频| 亚洲人成免费网站| 日本国产一区二区三区| 国产丰满美女做爰| 国产三级三级三级精品8ⅰ区| 精品国产一区二区三区在线| 欧美激情20| 欧美一级爆毛片| 谁有免费的黄色网址| 亚洲国产一成人久久精品| 欧美亚洲另类在线| 亚洲欧美另类日韩| 中文字幕亚洲区| 少妇高潮喷水在线观看| gogo大尺度成人免费视频| 亚洲性xxxx| 亚洲 欧美 日韩 综合| 国产精品一区二区久久精品爱涩| 神马影院午夜我不卡| 亚洲精华液一区二区三区| 欧美大片在线观看一区| 无码黑人精品一区二区| 美女视频网站黄色亚洲| 欧美精品亚洲精品| zzzwww在线看片免费| 91精品国产综合久久婷婷香蕉 | 亚洲一级片免费| 四虎5151久久欧美毛片| 久久久久国产精品免费| 国产欧美综合视频| 最新国产成人在线观看| 中文字幕在线综合| 色琪琪久久se色| 国产精品视频26uuu| 久久国产精品高清一区二区三区| 精品色蜜蜜精品视频在线观看| 久久人妻少妇嫩草av蜜桃| 五月天久久网站| 3d动漫精品啪啪一区二区三区免费| 婷婷五月在线视频| 91精品国产91久久综合桃花| 一区二区三区影视| 国产一区二区伦理| 激情五月五月婷婷| 日本在线视频一区二区三区| 久久久www成人免费精品| 91精品国产乱码久久| **性色生活片久久毛片| 免费网站在线观看黄| 中文一区一区三区免费在线观看| 亚洲综合在线中文字幕| a视频在线免费看| 日韩欧美你懂的| 日本特黄特色aaa大片免费| 成人午夜av电影| 久久久久久久中文| 国产一区网站| 成人av在线网址| 久草在线视频福利| 亚洲精品美女免费| 波多野结衣视频网址| 国产精品欧美精品| 一个人看的视频www| 亚洲精品美女| 日韩久久在线| 成人污版视频| 国产最新精品视频| 嫩草在线播放| 91精品国产综合久久蜜臀| 免费在线观看av网址| 99久久精品国产一区二区三区 | 久久香蕉精品视频| 久久综合久久鬼色| 亚洲欧美视频二区| 欧美久久综合| 欧美性大战久久久久| 欧美高清影院| 午夜免费日韩视频| 成人在线免费公开观看视频| 欧美一区三区二区| 亚洲GV成人无码久久精品| 亚洲欧洲成人自拍| 捆绑凌虐一区二区三区| 麻豆精品久久精品色综合| www.xxx麻豆| 精品欧美久久| 国产嫩草一区二区三区在线观看 | 国内在线观看一区二区三区| 久久一区免费| 欧美第一在线视频| 国产91色在线播放| 羞羞视频在线观看免费| 亚洲免费电影一区| 性一交一乱一精一晶| 在线免费观看日韩欧美| 欧美成人精品欧美一级| 欧美激情一区在线观看| 折磨小男生性器羞耻的故事| 美女在线视频一区| 国产日产欧美视频| 欧美日韩亚洲国产精品| 午夜视频久久久| 欧美一性一交| 69堂成人精品视频免费| 91国内外精品自在线播放| 97视频在线看| 精精国产xxxx视频在线中文版| 亚洲日韩欧美视频一区| 蜜桃久久一区二区三区| 555www色欧美视频| 中文字幕a级片| 色婷婷激情综合| 在线免费观看毛片| 亚洲精品视频免费看| 色www亚洲国产阿娇yao| 26uuu色噜噜精品一区| 国产吃瓜黑料一区二区| 精品在线免费观看| 最新中文字幕2018| 久久久久久网| www.av中文字幕| 亚洲天堂激情| www污在线观看| 综合精品一区| 日韩视频一二三| 99久久夜色精品国产亚洲96| 日韩三级电影| 精品国产一区二区三区小蝌蚪| 久久久精彩视频| 日韩啪啪网站| 久久人人爽爽人人爽人人片av| 久久a爱视频| 激情视频一区二区| 欧美大胆视频| 久久精品国产美女| 色婷婷av一区二区三区丝袜美腿| 国产精品三区www17con| 最新国产精品精品视频| 亚洲最大的免费| 亚洲综合影院| 含羞草久久爱69一区| 噜噜噜狠狠夜夜躁精品仙踪林| 国产精品一区二区欧美黑人喷潮水 | 影音先锋久久资源网| 大桥未久一区二区三区| 亚洲欧美色图| www.avtt| 午夜亚洲视频| 欧美激情精品久久久久久小说| 日韩精品一卡二卡三卡四卡无卡| 韩国中文字幕av| 久草这里只有精品视频| 色91精品久久久久久久久| 国产一区二区三区四区在线观看| 99国产精品免费视频| 国产98色在线|日韩| 国产午夜在线一区二区三区| 99久久国产综合色|国产精品| 国产国语性生话播放| 久久精品视频一区二区| 国产精品69久久久久孕妇欧美| 一区免费观看视频| 国产主播在线观看| 日韩欧美福利视频| 中文在线字幕av| 欧美一区二区视频在线观看2020 | 亚洲另类图片色| 午夜看片在线免费| 欧美激情一区二区三区久久久| 理论不卡电影大全神| 国产精品91在线| 国产精品色婷婷在线观看| 国产一区二区精品在线| 国产影视精品一区二区三区| 三年中文高清在线观看第6集| 韩日成人av| 91淫黄看大片| 国产成人免费在线视频| 老牛影视av老牛影视av| 亚洲视频一二三| 日产欧产va高清| 欧美日韩精品三区| 欧美在线精品一区二区三区| 亚洲欧洲黄色网| 日本孕妇大胆孕交无码| 国产精品福利网站| 亚洲日本va| 色综合久久久久久久久五月| 欧美在线精品一区| 天堂在线资源视频| 成人激情免费网站| 欧美成人久久久免费播放| 五月天激情综合| 国产美女三级无套内谢| 日韩国产精品视频| 中文字幕在线观看播放| 国产国语刺激对白av不卡| 凹凸av导航大全精品| 伊人色综合久久天天五月婷| 国产一区二区精品| 久草福利在线观看| 国产精品美女www爽爽爽| 91看片在线播放| 日韩一区二区在线观看视频 | 中文字幕欧美国产| 中文字幕手机在线观看| 欧美日韩一区二区欧美激情| 青梅竹马是消防员在线| 欧美日韩国产二区| 亚洲伦理久久| 亚洲国产精品毛片| 亚洲制服少妇| 国产麻豆天美果冻无码视频| 樱花影视一区二区| 一区二区三区黄色片| 亚洲新声在线观看| 久久人体大尺度| 久久av一区二区| a91a精品视频在线观看| 日本一级大毛片a一| 亚洲精品视频观看| 国产免费久久久| 日韩有码片在线观看| 素人啪啪色综合| 日本在线播放不卡| 老**午夜毛片一区二区三区| 午夜久久久久久久| 午夜精品久久久久久久99水蜜桃| 国产av无码专区亚洲av麻豆| 久久久精品影院| 亚洲精品大片| 特级黄色录像片| 韩国三级电影一区二区| 欧美另类69xxxx| 欧美美女一区二区在线观看| 日本电影全部在线观看网站视频| 国产精品久久久久久久av大片| 国产成人久久| 国产精品人人妻人人爽人人牛| 久久影院视频免费| 潘金莲一级淫片aaaaaa播放| 亚洲欧美制服第一页| 成人av三级| 视频一区二区综合| 久久福利资源站| 日韩精品一区二区亚洲av性色| 91精品综合久久久久久| 青草影视电视剧免费播放在线观看| 91超碰在线免费观看| 欧美日本在线| 日韩av手机在线播放| 色天天综合色天天久久| 国产黄色片在线播放| 国产精品一区二区三区成人| 91亚洲人成网污www| 国产精品熟女一区二区不卡| 亚洲综合成人网| 天堂资源最新在线| 国产精品狠色婷| 亚洲成av人电影| 好吊色视频一区二区三区| 日韩欧美国产一区二区| av在线播放av| 99国产超薄肉色丝袜交足的后果| 亚洲理伦在线| 超碰97av在线| 日韩片之四级片| xxxxxx欧美| 日本一区二区免费高清视频| 福利电影一区二区三区| 国产精品视频123| 另类图片亚洲另类| 日韩成人一级| 潘金莲激情呻吟欲求不满视频| 夜夜精品浪潮av一区二区三区| 污视频在线免费| 国产乱人伦真实精品视频| 中文乱码免费一区二区三区下载| 久久久久久久久免费看无码| 欧美日韩一区中文字幕| 欧美野外wwwxxx| 青青影院一区二区三区四区| 国内不卡的二区三区中文字幕| 日韩精品手机在线| 日韩综合视频在线观看| 国产香蕉精品| 亚洲欧美日韩三级| 精品久久久久久久久久国产| 夜级特黄日本大片_在线| 精品国产免费一区二区三区| 久久99这里只有精品| 亚洲精品男人天堂|