constructor 未指向建構函式
constructor 翻譯成漢語是構造器的意思。
恰如其名,物件例項的constructor 屬性通常是指向建構函式。
關於此屬性更多內容參閱JavaScript constructor一章節。
程式碼例項如下:
[JavaScript] 純文字檢視 複製程式碼執行程式碼function Foo(){} let f=new Foo(); console.log(f.constructor===Foo);
程式碼執行效果截圖如下:
f是建構函式Foo的物件例項,很自然f.constructor指向Foo。
通常認為這是自然且永恆的事情,然而事實有時候會讓人比較意外。
由此可能會導致一些莫名其妙的錯誤,且不容易查詢,因為您已經堅信那地方是正確無比的。
下面演示一下讓人意外的現象,看如下程式碼例項:
[JavaScript] 純文字檢視 複製程式碼執行程式碼function Foo(){} Foo.prototype={} let f=new Foo(); console.log(f.constructor===Foo);
程式碼執行效果截圖如下:
列印結果是false,也就是說constructor並未指向建構函式。
難不成f並非建構函式Foo的物件例項,其實不然,f肯定是Foo的物件例項,constructor沒有指向F也並不不妥。
下面對形成上述現象的原因分步進行一下詳細分析:
(1).首先,物件例項本身並沒有constructor屬性,它是繼承自原型鏈。
(2).預設情況下,建構函式原型物件的constructor屬性被人為設計為指向建構函式。
(3).所以,如果沒有其他改動,物件例項會繼承constructor屬性,很自然,它會指向建構函式。
下面開始進入關鍵點,分析為什麼沒有指向建構函式:
Foo.prototype={},這是什麼操作,這是重置原型物件,再強調一下是重置而不僅僅是修改。
整個原型物件被替換掉,新原型物件constructor屬性自然會指向構建它的建構函式。
特別說明:如無必要的原因,儘量不要重置原型物件。
程式碼演示如下:
[JavaScript] 純文字檢視 複製程式碼執行程式碼function Foo(){} Foo.prototype={} let f=new Foo(); console.log(Foo.prototype.constructor===Object); console.log(f.constructor===Object);
程式碼執行效果截圖如下:
執行結果說明了一切,新原型物件中的constructor不會自動指向F,而是指向建立它的建構函式。
所以我們要人為的對它的指向進行一下調整,程式碼修改如下:
[JavaScript] 純文字檢視 複製程式碼執行程式碼function Foo(){} Foo.prototype={} Foo.prototype.constructor=Foo; let f=new Foo(); console.log(f.constructor===Foo);
程式碼執行效果截圖如下:
很簡單的操作,重置一下constructor指向即可,於是一切歸於正常。
此操作通常是必須的,否則將難以追尋物件例項是由哪個建構函式建立。
相關文章
- 預設建構函式、引數化建構函式、複製建構函式、解構函式函式
- 建構函式與解構函式函式
- ## 建構函式函式
- C++ 建構函式和解構函式C++函式
- 類的建構函式和解構函式函式
- JavaScript 建構函式JavaScript函式
- PHP筆記:建構函式與解構函式PHP筆記函式
- js函式中的this指向JS函式
- 【C++】初始化列表建構函式VS普通建構函式C++函式
- C++中建構函式,拷貝建構函式和賦值函式的詳解C++函式賦值
- 11-建構函式函式
- 初識建構函式函式
- JavaScript Date()建構函式JavaScript函式
- 建構函式建立物件函式物件
- 建構函式詳解函式
- 建構函式和類函式
- 關於建構函式與解構函式的分享函式
- C++入門記-建構函式和解構函式C++函式
- 建構函式與普通函式的區別函式
- 【譯】JavaScript 工廠函式 vs 建構函式JavaScript函式
- 箭頭函式this指向詳解函式
- 箭頭函式this指向的陷阱函式
- 箭頭函式的this指向(二)函式
- 回顧Javascript建構函式JavaScript函式
- JS 建構函式與類JS函式
- Dart建構函式介紹Dart函式
- Java建構函式詳解Java函式
- Java泛型建構函式Java泛型函式
- JS 中的函式 this 指向總結JS函式
- 函式內部This的指向問題函式
- 預設建構函式和帶預設值的建構函式不能同時存在函式
- 建構函式方式建立正規表示式函式
- 建構函式、原型及原型鏈函式原型
- 建構函式之間的呼叫函式
- 繼承中的建構函式繼承函式
- 預設建構函式學習函式
- swoole 服務的建構函式函式
- EXTJS 建構函式帶引數JS函式