原型鏈的理解
在理解原型鏈之前,首先要知道建構函式、例項、原型三者是什麼,以及之間的關係。
建構函式
function person() {}
//例項
var person = new person();
建構函式: 和普通函式沒什麼區別,不過建構函式的首寫字母始終都是大寫的,
這是區別於普通函式,它是專門用來建立物件存在的。
例項:就是new乙個建構函式。
原型:是乙個物件,屬性和方法是共享的,即共有的。
多個例項可以共享裡面的屬性和方法。
建構函式、原型、例項這三者有著什麼微妙關係呢?
person.prototype ===
person.prototype.constructor === person
person.___proto__ ===
了解了這些基本的,我們就可以來理解什麼是原型鏈了?
先看看書上的描述:
eacmscript中描述了原型鏈的概念,並將原型鏈作為實現繼承的主要方法。
其基本思想是:
利用原型讓乙個引用型別繼承另乙個引用型別的屬性和方法。
簡單的回顧一下:原型和例項的關係:
每個建構函式都有乙個原型物件,原型物件都包含乙個指向建構函式的指標,
而例項包含乙個指向原型物件的內部指標。
那麼我們讓原型物件等於另乙個型別的例項,結果會怎樣呢?
顯然此時的原型物件將包含乙個指向另乙個原型的指標,
相應地,另乙個原型也包含乙個指向另乙個建構函式的指標。
假如另乙個原型又是另乙個型別的例項,那麼上述的關係依然成立,
如此層層遞進,就構成了例項與原型的鏈條。這就是所謂原型鏈的基本概念。
上面這段話是書上原文,我覺得沒有比書上寫的更簡單、通俗易懂了。
下面是乙個例子
//父類建構函式person
function person()
//建構函式的原型方法
person.prototype.sayname = function()
//子類建構函式
function son()
//子類建構函式的原型
//在這裡把父類的例項賦給了子類的原型上,從而實現了繼承,從而可以共享父類的屬性和方法。
son.prototype = new person();
//子類建構函式的例項
var son1 = new son();
//子類共享父類的屬性
console.log(son1.name); //小仙女
//子類共享父類的方法
console.log('son1.sayname()',son1.sayname()); //小仙女
上面**定義了兩個型別:父類(perosn)和子類(son)。
父類有乙個屬性name。原型上有乙個sayname()方法。
在這裡子類son繼承了父類的方法和屬性,為什麼呢?
因為下面這行**:
son.prototype = new person()
子類父類的例項賦給了son的原型,因此son的原型相當於重寫。以前son的原型本來沒有屬性和方法,
現在都有了(繼承了父類的屬性和方法)。因此son1.name是』小仙女』。還有呼叫son1.sayname列印的也是』小仙女』。
實現的本質是:
重寫原型物件,代之以乙個新型別的例項。
原型鏈的理解
此貼用於記錄原型鏈相關的一些東西。函式都有prototype,物件都有 proto 乙個函式的prototype和乙個物件的 proto 就是原型,原型其實也是乙個物件。乙個函式的prototype和這個函式的示例物件的 proto 是同乙個引用,即 function a let a new a c...
原型鏈的理解
此貼用於記錄原型鏈相關的一些東西。函式都有prototype,物件都有 proto 乙個函式的prototype和乙個物件的 proto 就是原型,原型其實也是乙個物件。乙個函式的prototype和這個函式的示例物件的 proto 是同乙個引用,即 function a let a new a c...
原型鏈的理解
此貼用於記錄原型鏈相關的一些東西。函式都有prototype,物件都有 proto 乙個函式的prototype和乙個物件的 proto 就是原型,原型其實也是乙個物件。乙個函式的prototype和這個函式的示例物件的 proto 是同乙個引用,即 function a let a new a c...