談談小白理解的js中的原型鏈問題

2021-07-11 19:39:28 字數 1567 閱讀 7564

原型中的問題主要是理清楚建構函式,例項和原型物件之間的關係,每乙個建構函式都會有乙個原型物件,原型物件都包含乙個指向建構函式的指標(在屬性constructor中),每個例項也都有乙個指向原型物件的指標。如果我們進一步設想,把原型物件作為另乙個型別的例項又會怎麼樣呢?按照之前的理論,這個例項也會有乙個自己的原型物件,三條指標也都會有,假如原型還是另乙個型別的例項?如此層層遞進,我們可以得到一條鏈,這條鏈就是原型鏈。

實現的**如下:

function supertype(){

this.property = true;

supertype.prototype.getsupervalue = function(){

return this.property;

function  subtype(){

this.subproperty = false;

//繼承supertype

sub.prototype =  new supertype();

sub.prototype.getsubvalue = function(){

return this.subproperty;

var  instance = new subtype();

alert(instance.getsupervalue());      //true;

我們把上面提到的原型和例項先捋清楚,先有乙個型別supertype,這個型別的原型是subervalue.prototype,原型中寫入了乙個方法getsubervalue,由於沒有例項化這個物件,所以目前有兩條指標,一條是subervalue中的prototype屬性指向原型物件,還有一條是原型物件指向建構函式的指標。另乙個型別是subtype和他的原型subtype prototype物件,用建構函式例項化了乙個例項instance,目前為止的話這裡又有了三條指標,請自行腦補,然後最關鍵的是:

sub.prototype = new supertype();

這句話就是把sub的原型當成了suber的乙個例項了,既然當成了例項,那麼這個「例項「  還要有自己的原型,那麼這個原型就是supertype prototype了,所以關鍵的是如下的這條指標: 這條指標是subtype prototype中的prototype屬性指向原型物件supervalue prototype原型物件。這意味著原來存在於supervalue中的所有屬性和方法現在也存在於

subtype.prototype,而通過這條鏈,可以直接讓instance直接呼叫getsupervalue方法了。

由於我們知道,所有的引用型別本質上都是繼承了object型別,這個型別也是用原型鏈來實現的,所以上面的原型鏈還不夠完整,還應該在原有的基礎上加上三條,一條是super prototype中的prototype屬性,值為指向object prototype原型物件,因為supervalue prototype原型物件作為object 的例項,也可以說繼承了object,object建構函式中有一條指標指向object.prototype原型物件,原型物件中有一條指向建構函式。我們可以說instance是object ,supervalue,subtype中任何乙個型別的例項,同理,我們也可以說這三個任意乙個都是instance的原型。

js原型鏈的理解

其實之前對js原型鏈有個基本的理解,但工作中用到的並不多,逐漸忘記了。所以準備寫個部落格。我覺得首先得明白乙個,就是每一次建立乙個建構函式 其實就是普通的函式 的時候,都會根據乙個特定的規則建立乙個原型屬性 prototype 其中包括兩項 construct和 proto 其次先來看下構造 函式建...

js的原型和原型鏈理解

以以下 為例 let arr 1,3,2,0 arr.reverse arr.tostring 我們使用console.dir arr 命令 發現arr.proto 屬性上有reverse 和tostring 方法了 用console.dir arr 發現,arr不僅有我們定義的四個值,其proto...

JS學習 原型鏈的理解

首先我們先建立乙個建構函式,並建立兩個例項 shirt.prototype 任何乙個函式都有此屬性,但它只有函式當做類來用的時候才有意義,把所有共享的方法都儲存在此屬性上。這個屬性明顯是乙個物件型。我覺得可以通俗的將原型理解為共享雲,之後定義的例項都可以訪問,也可以修改。例項的查詢是分優先順序的,首...