一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

領(lǐng)悟 JavaScript 中的面向?qū)ο?- JavaScript - web - Jav...

 muyeyifan 2010-09-04

領(lǐng)悟 JavaScript 中的面向?qū)ο?/p>

 

注:讀完本文后請務(wù)必接著看完所有回復(fù)!

JavaScript 是面向?qū)ο蟮?。但是不少人對這一點理解得并不全面。

在 JavaScript 中,對象分為兩種。一種可以稱為“普通對象”,就是我們所普遍理解的那些:數(shù)字、日期、用戶自定義的對象(如:{})等等。

還有一種,稱為“方法對象”,就是我們通常定義的 function。你可能覺得奇怪:方法就是方法,怎么成了對象了?但是在 JavaScript 中,方法的確是被當(dāng)成對象來處理的。下面是一個簡單的例子:

Js代碼 復(fù)制代碼
  1. function func() {alert('Hello!');}   
  2. alert(func.toString());  

在這個例子中,func 雖然是作為一個方法定義的,但它自身卻包含一個 toString 方法,說明 func 在這里是被當(dāng)成一個對象來處理的。更準(zhǔn)確的說,func 是一個“方法對象”。下面是例子的繼續(xù):

Js代碼 復(fù)制代碼
  1. func.name = “I am func.”;   
  2. alert(func.name);  

我們可以任意的為 func 設(shè)置屬性,這更加證明了 func 就是一個對象。那么方法對象和普通對象的區(qū)別在哪里呢?首先方法對象當(dāng)然是可以執(zhí)行的,在它后面加上一對括號,就是執(zhí)行這個方法對象了。

Js代碼 復(fù)制代碼
  1. func();  

所以,方法對象具有二重性。一方面它可以被執(zhí)行,另一方面它完全可以被當(dāng)成一個普通對象來使用。這意味著什么呢?這意味著方法對象是可以完全獨立于其他對象存在的。這一點我們可以同 Java 比較一下。在 Java 中,方法必須在某一個類中定義,而不能單獨存在。而 JavaScript 中就不需要。

方法對象獨立于其他方法,就意味著它能夠被任意的引用和傳遞。下面是一個例子:

Js代碼 復(fù)制代碼
  1. function invoke(f) {   
  2.     f();   
  3. }   
  4. invoke(func);  

將一個方法對象 func 傳遞給另一個方法對象 invoke,讓后者在適當(dāng)?shù)臅r候執(zhí)行 func。這就是所謂的“回調(diào)”了。另外,方法對象的這種特殊性,也使得 this 關(guān)鍵字不容易把握。這方面相關(guān)文章不少,這里不贅述了。

除了可以被執(zhí)行以外,方法對象還有一個特殊的功用,就是它可以通過 new 關(guān)鍵字來創(chuàng)建普通對象。

話說每一個方法對象被創(chuàng)建時,都會自動的擁有一個叫 prototype 的屬性。這個屬性并無什么特別之處,它和其他的屬性一樣可以訪問,可以賦值。不過當(dāng)我們用 new 關(guān)鍵字來創(chuàng)建一個對象的時候,prototype 就起作用了:它的值(也是一個對象)所包含的所有屬性,都會被復(fù)制到新創(chuàng)建的那個對象上去。下面是一個例子:

Js代碼 復(fù)制代碼
  1. func.prototype.name=”prototype of func”;   
  2. var f = new func();   
  3. alert(f.name);  

執(zhí)行的過程中會彈出兩個對話框,后一個對話框表示 f 這個新建的對象從 func.prototype 那里拷貝了 name 屬性。而前一個對話框則表示 func 被作為方法執(zhí)行了一遍。你可能會問了,為什么這個時候要還把 func 執(zhí)行一遍呢?其實這個時候執(zhí)行 func,就是起“構(gòu)造函數(shù)”的作用。為了形象的說明,我們重新來一遍:

Js代碼 復(fù)制代碼
  1. function func() {   
  2.     this.name=”name has been changed.”   
  3. }   
  4. func.prototype.name=”prototype of func”;   
  5. var f = new func();   
  6. alert(f.name);  

你就會發(fā)現(xiàn) f 的 name 屬性不再是"prototype of func",而是被替換成了"name has been changed"。這就是 func 這個對象方法所起到的“構(gòu)造函數(shù)”的作用。所以,在 JavaScript 中,用 new 關(guān)鍵字創(chuàng)建對象是執(zhí)行了下面三個步驟的:
  1. 創(chuàng)建一個新的普通對象;
  2. 將方法對象的 prototype 屬性的所有屬性復(fù)制到新的普通對象中去。
  3. 這句話有待商榷,
    "將方法對象的 prototype 屬性的所有屬性復(fù)制到新的普通對象中去。"
    其實并沒有復(fù)制,
    之所以對象能夠執(zhí)行prototype 屬性定義的方法,是因為用構(gòu)造方法生成的對象和構(gòu)造方法之間有緊密聯(lián)系,
    對象尋找屬性時,如果自己沒有這個屬性,會在構(gòu)造方法的propotype所指向/引用的對象中找,看能否找到同名屬性,
    如果找到,就會讀取它的值并返回.(這個過程會持續(xù)向上,直到持續(xù)到Object對象為止,即所謂原型方式的繼承).

    注意:以上是讀,如果寫一個屬性的話就是直接給這個對象定義了一個屬性,讀寫不對等,在<javascript權(quán)威指南>
    有很好說明.
    任何對象都可以看做是構(gòu)造方法new出來的,一個直接對象如{a:3,b:4}實際繼承Object

  4. 以新的普通對象作為上下文來執(zhí)行方法對象。

對于“new func()”這樣的語句,可以描述為“從 func 創(chuàng)建一個新對象”。總之,prototype 這個屬性的唯一特殊之處,就是在創(chuàng)建新對象的時候了。


那么我們就可以利用這一點。比如有兩個方法對象 A 和 B,既然從 A 創(chuàng)建的新對象包含了所有 A.prototype 的屬性,那么我將它賦給 B.prototype,那么從 B 創(chuàng)建的新對象不也有同樣的屬性了?寫成代碼就是這樣:

 

Js代碼 復(fù)制代碼
  1. A.prototype.hello = function(){alert('Hello!');}   
  2. B.prototype = new A();   
  3. new B().hello();  

這就是 JavaScript 的所謂“繼承”了,其實質(zhì)就是屬性的拷貝,這里利用了 prototype 來實現(xiàn)。如果不用 prototype,那就用循環(huán)了,效果是一樣的。所謂“多重繼承”,自然就是到處拷貝了。

JavaScript 中面向?qū)ο蟮脑?,就是上面這些了。自始至終我都沒提到“類”的概念,因為 JavaScript 本來就沒有“類”這個東西。面向?qū)ο罂梢詻]有類嗎?當(dāng)然可以。先有類,然后再有對象,這本來就不合理,因為類本來是從對象中歸納出來的,先有對象再有類,這才合理。像下面這樣的:

Js代碼 復(fù)制代碼
  1. var o = {}; // 我發(fā)現(xiàn)了一個東西。   
  2. o.eat = function(){return "I am eating."}  // 我發(fā)現(xiàn)它會吃;   
  3. o.sleep = function(){return "ZZZzzz..."}  // 我發(fā)現(xiàn)它會睡;   
  4. o.talk = function(){return "Hi!"// 我發(fā)現(xiàn)它會說話;   
  5. o.think = function(){return "Hmmm..."// 我發(fā)現(xiàn)它還會思考。   
  6.   
  7. var Human = new Function(); // 我決定給它起名叫“人”。   
  8. Human.prototype = o; // 這個東西就代表了所有“人”的概念。   
  9.   
  10. var h = new Human(); // 當(dāng)我發(fā)現(xiàn)其他同它一樣的東西,   
  11. alert(h.talk()) // 我就知道它也是“人”了

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    亚洲一区二区三区国产| 欧美欧美日韩综合一区| 色丁香一区二区黑人巨大| 亚洲一区二区三区四区| 高清国产日韩欧美熟女| 青青操在线视频精品视频| 好吊视频有精品永久免费| 亚洲国产黄色精品在线观看| 久久精品国产在热久久| 亚洲丁香婷婷久久一区| 欧美国产日本高清在线| 最新日韩精品一推荐日韩精品| 福利视频一区二区三区| 五月天综合网五月天综合网| 麻豆亚州无矿码专区视频| 国产大屁股喷水在线观看视频| 国产精品亚洲综合天堂夜夜| 乱女午夜精品一区二区三区| 亚洲国产四季欧美一区| 人人爽夜夜爽夜夜爽精品视频| 日韩免费成人福利在线| 亚洲成人精品免费在线观看| 激情偷拍一区二区三区视频 | 亚洲精品福利视频你懂的| 久久精品国产99国产免费| 中文字幕精品少妇人妻| 国产永久免费高清在线精品| 91爽人人爽人人插人人爽| 日本高清视频在线观看不卡| 亚洲欧美日韩中文字幕二欧美| 99热九九在线中文字幕| 日本欧美一区二区三区就| 高跟丝袜av在线一区二区三区| 欧美有码黄片免费在线视频| 麻豆印象传媒在线观看| 欧美在线视频一区观看| 欧美大胆女人的大胆人体| 中文字幕人妻日本一区二区| 亚洲av在线视频一区| 91福利视频日本免费看看| 日韩高清毛片免费观看|