js原型鏈之我見

2022-04-05 13:32:19 字數 873 閱讀 7791

前兩天從網上看到乙個題目,大致內容如下:

var f=function

(){};

function.prototype.a=function();

object.prototype.b=function();

var f=new

f();

f.b();

f.a();

初看這道題,覺得很簡單,應該會輸出 "b" 和 "a"吧,但是實際執行起來,不是那麼回事,實際結果是:第二個函式報錯了,沒有找到a的定義。怎麼回事?

其實,這道題目主要考察大家對原型鏈的理解。我們知道,當乙個物件其中找不到某個屬性時,會沿著其原型鏈向上檢視其它物件中是否有該屬性,直到找到為止,如果都沒有找到的話,這時就像上面的題目一樣會報錯了。

原型鏈是怎麼構建起來的呢? 在js的世界裡,萬物皆物件,每個物件中都有乙個私有的__proto__屬性,該屬性用來標識其上一級的原型物件,就這樣通過這個屬性把整個原型鏈構建起來。

而題目中的原型鏈又是怎樣的呢?從原型鏈的最頂端開始(就是當前的物件f)構建原型鏈。我們知道__proto__屬性值其實就是當前物件建構函式的prototype屬性值,因此就有下面的等式:

f.__proto__===f.prototype;//f的建構函式是 f

f.prototype.__proto__===object.prototype;  的建構函式是object

同理,總結原型鏈如下:

f---->f.prototype---->object.prototype---->null

f---->function.prototype---->object.prototype---->null

因此,f.a不存在就顯而易見了。

JS 物件 JS原型 原型鏈

參考學習 js物件 構造器函式 建立物件的函式。物件分為普通物件和函式物件。所有物件都有 proto 屬性 函式物件不止有 proto 屬性,還有prototype屬性 稱為原型物件 1.new function 產生的物件都是函式物件。2.所有函式物件的 proto 都指向function.pro...

js 原型與原型鏈

5條原型規則 1.所有的引用型別 陣列 物件 函式 都具有物件特性,即可自由擴充套件屬性 除了 null 除外 2.所有的引用型別 陣列 物件 函式 都有乙個 proto 隱式原型 屬性,屬性值是乙個普通的物件。3.所有的函式,都有乙個prototype 顯式原型 屬性,屬性值也是乙個普通的物件。4...

JS原型物件,原型鏈

js中建立物件都是通過建構函式建立的,所以每個物件中都有乙個指向其建構函式的指標constructor var obj new object var arr new array var obj2 字面量建立實質上是上面方式的簡寫 var arr2 var str new string test 建立...