原型鏈的理解

2021-09-21 07:41:25 字數 1889 閱讀 4205

原型鏈的理解

在理解原型鏈之前,首先要知道建構函式、例項、原型三者是什麼,以及之間的關係。

建構函式

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...