最近在看 j**ascript忍者秘籍 這本書的時候,再加上最近遇到的關於原型、原型鏈的面試題,所以萌生了要把這些知識梳理一遍的想法,所以以下是我自己對原型、原型鏈的看法提到原型,我們可能都會想到與物件有關的東西,但其實,原型是與函式才是密切相關的。每當我們建立乙個函式,都會有乙個指向該函式的原型物件的指標
prototype
,然後該原型物件上又有乙個指向該函式的指標constructor
,在這裡,如果我們這個函式是乙個建構函式,那麼我們每例項化乙個物件,該物件都會有乙個指向該建構函式的原型物件的指標_proto_
,那麼我就以乙個小的例子來講解一下原型物件,建構函式與例項的關係。
從圖中可以看出,通過建構函式ninja()
建立了乙個物件,並且這個物件的引用是乙個變數ninja
,然後該建構函式,又有乙個指向它的原型物件的屬性prototype
。
談到原型,接下來就是原型物件的幾個知識點。
function ninja()
}ninja.prototype.swingsword = function();
var ninja = new ninja();
ninja.swingsword();//false
因為每次訪問例項中的屬性是,都是乙個向上查詢的過程,會先從例項物件上查詢有無這個屬性,如果有,就返回這個屬性,如果沒有,就會繼續往它的原型物件上找,一層層往上尋找,如果沒有,就返回undefined。
function ninja()
ninja.prototype.swingsword = function();
var ninja = new ninja();
ninja,prototype.swingsword = function()
ninja.swingsword();//false;
原型鏈與j**ascript中的繼承密切相關,可以說,繼承是通過原型鏈來實現的。原型鏈可以理解為乙個物件的例項是另乙個物件的原型,然後另乙個物件的例項又是另乙個物件的原型,依次類推形成的乙個鏈式結構所以一般實現繼承的方式是:將父類的例項作為子類的原型,用下面這個例子來講解一下
從可以看出,讓person
的乙個例項作為子類ninja
物件的原型,這樣,ninja就繼承了person上的所有屬性和方法,包括建構函式上的還有原型上的,這就是原型鏈實現繼承的方法。
那麼為什麼我們不直接將父類的原型物件直接賦給子類的原型物件呢,那是因為如果我們這樣做的話,對子類原型物件的改變,將會直接影響到了父類中的原型物件,這是乙個不可取的方法。
JS高階之原型,原型鏈,繼承
一 原型 1.原型是function物件的乙個屬性,它定義了建構函式製造出的物件的公共祖先,通過建構函式例項化的物件可以繼承該原型的屬性和方法,原型也是物件 2.例項物件可以訪問自己的屬性和方法,也可以訪問原型物件的屬性和方法,例項物件和原型物件都有的屬性和方法,訪問的是例項物件的 3.利用原型的特...
JS高階 原型和原型鏈
原型鏈是一種關係,例項物件和原型物件之間的關係,關係是通過例項物件中瀏覽器使用的原型 proto 來聯絡的 自定義建構函式,通過例項化,建立例項物件 例項物件中 proto 是原型,瀏覽器使用的 建構函式中的prototype是原型,程式設計師使用的 使用物件 使用物件中的屬性和物件中的方法,使用物...
js 高階 原型與原型鏈
所有函式都有乙個特別的屬性 prototype 顯式原型屬性 所有例項物件都有乙個特別的屬性 proto 隱式原型屬性 1.每個函式都有乙個prototype屬性,它預設指向乙個物件 objectg 即稱為 原型物件 顯式原型與隱式原型的關係 函式的prototype 定義函式時被自動賦值,值預設為...