深入理解JS instanceof和原型鏈

2021-07-31 13:39:41 字數 1576 閱讀 7327

又介紹乙個老朋友——instanceof。

對於值型別,你可以通過typeof判斷,string/number/boolean都很清楚,但是typeof在判斷到引用型別的時候,返回值只有object/function,你不知道它到底是乙個object物件,還是陣列,還是new number等等。

這個時候就需要用到instanceof。

例如:

function

分析:instanceof運算子的第乙個變數是乙個物件,暫時稱為a;第二個變數一般是乙個函式,暫時稱為b。

instanceof的判斷隊則是:沿著a的proto這條線來找,同時沿著b的prototype這條線來找,如果兩條線能找到同乙個引用,即同乙個物件,那麼就返回true。如果找到終點還未重合,則返回false。這就很好地解釋了上述**的輸出結果啦。

那麼問題來了,instanceof這樣設計,到底有什麼用?到底instanceof想表達什麼呢?

重點就這樣被這位老朋友給引出來了——繼承——原型鏈。要談到原型鏈,首先必須談到繼承,在js中,繼承是通過原型鏈來體現出來的。

如:

function foo(){}

var f1=new foo();

f1.a=10

;foo.prototype

.a=100

;foo.prototype

.b=200

;console.log(f1.a);//10

console.log(f1.b);//200

以上**中,f1是foo函式new出來的物件,f1.a是f1物件的基本屬性,f1.b是怎麼來的呢?——從foo.prototype得來,因為f1.proto指向的是foo.prototype

訪問乙個物件的屬性時,先在基本屬性中查詢,如果沒有,再沿著proto這條鏈向上找,這就是原型鏈。

看圖說話:

那麼我們在實際應用中如何區分乙個屬性到底是基本的還是從原型中找到的呢?大家可能都知道答案了——hasownproperty,特別是在for…in…迴圈中,一定要注意!!

那麼f1為什麼有hasownproperty方法?

其實呢,物件的原型鏈是沿著proto這條線走的,因此在查詢f1.hasownproperty屬性時,就會順著原型鏈一直查詢到object.prototype。

由於所有的物件的原型鏈都會找到object.prototype,因此所有的物件都會有object.prototype的方法。這就是所謂的「繼承」。

以上純屬通過學習後的個人理解,如有錯誤,請指正,謝謝!

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...

mysql 索引深入理解 深入理解MySql的索引

為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...