前言:我們創(chuàng)建的每個函數(shù)都有一個prototype屬性,這個屬性是一個指針,指向的是一個對象,這個對象的作用是包含由該構造函數(shù)創(chuàng)建實例共享的屬性和方法。通過字面意思來了解,prototype是通過構造函數(shù)創(chuàng)建對象實例的原型對象,使用原型對象的好處就是可以讓所有的實例共享它所包含的屬性和方法,這樣就不會像構造函數(shù)模式,在每次創(chuàng)建一個新的實例后都會將內(nèi)部的方法重新創(chuàng)建一遍。如下例子圖1-1:

我們可以看到在Person構造函數(shù)的prototype原型上面我們掛載了屬性和方法,我們在創(chuàng)建實例的時候,每個實例都會有相同的屬性和方法,與構造函數(shù)模式不同的是這些屬性和實例都是共享的。
什么是原型對象?
在我們創(chuàng)建每一個函數(shù)的時候,都會根據(jù)特定的規(guī)則為該函數(shù)創(chuàng)建一個prototype屬性,這個屬性指向的是函數(shù)的原型對象。在每個函數(shù)的prototype屬性下面也會自動獲得一個constructor(構造函數(shù))屬性。我們可以打印一下Person.prototype.constructor,如下2-1:

創(chuàng)建自定義的構造函數(shù)后,其原型對象只會去得到constructor屬性,其他的方法都是從Object上繼承來的。當調(diào)用構造函數(shù)創(chuàng)建一個對象的時候,這個對象內(nèi)部將會有個一指針指向的是構造函數(shù)的原型對象上,我們管這個指正叫做[[Prototype]],在chrome等瀏覽器中打印出來顯示的是__proto__,我們要知道這個是連接實例對象和構造函數(shù)原型對象的。如圖3-1和3-2:


我們可以看到上圖中,實例對象的__proto__打印的是構造函數(shù)的原型對象,原型對象上也有一個constructor屬性,指向的是構造函數(shù)。
這里我們介紹兩個方法:isPrototypeOf() ?/ ?Object.getPrototypeOf(),根據(jù)英文的意思,第一個就是判斷某個原型對象是不是某個實例[[Prototype]]指向的原型對象,第二個是用來獲得某個實例對象的原型對象。如下圖代碼4-1和4-2:


之前我們不是說通過原型構造對象,所有的對象共享原型對象上的方法和屬性么,那么這是怎么共享的呢?當我們要讀取某個實例對象上的某個屬性或者方法的時候,它會在當前的對象上進行搜索,如果找到了那么就返回這個屬性或者方法,如果沒有找到,就會搜索指針指向的原型對象,在該原型對象上找到的話就會返回這個原型對象上的屬性值和方法....就這樣會一直找到Object對象上。那么反過來理解,如果我們在實例對象上新增一個同原型對象上一樣的name屬性,那么當讀取該name屬性的時候,就會讀取到當前實例對象上為止,就不會繼續(xù)往上讀取了。
這里我們再次介紹一個方法:hasOwnProperty(),該方法可以檢測一個屬性是否存在于實例中,還是存在于原型中(該方法繼承于Object)。如圖5-1例子:

如例子所示,hasOwnproperty方法是是用來判斷屬性或者方法是不是實例屬性方法還是原型上的屬性方法。
這個我們拋出一個問題,如何定義一個屬性是在實例對象上的還是在原型對象上的?那么我們要通過in操作符和hasOwnProperty()方法一起來判斷了,in操作符可以在for-in循環(huán)中使用,也可以單獨使用,單獨使用的時候,如果某個屬性在實例對象上或者原型對象上都返回TRUE,根據(jù)之前的例子可以知道,hasOwnProperty()方法只會在屬性在實例上的時候才返回TRUE,那么當操作符in返回TRUE的時候,hasOwnproperty()返回FALSE的時候,可以判斷當前屬性是在原型對象上的,而不是在實例對象上的。
有些困了,今天就復習到這里,明天進一步更新,更多的內(nèi)容可以看js高級程序設計....