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++基礎建構函式(constructor)C++函式Struct
- [CareerCup] 14.1 Private Constructor 私有構建函式Struct函式
- 使用bind()函式的產生的函式用作建構函式this的指向函式
- 關於Java建構函式(Constructor)的常見問題總結Java函式Struct
- 預設建構函式、引數化建構函式、複製建構函式、解構函式函式
- 建構函式與解構函式函式
- ## 建構函式函式
- 建構函式函式
- [譯] 建構函式已死,建構函式萬歲!函式
- C++ 建構函式和解構函式C++函式
- 類的建構函式和解構函式函式
- c# tcbs之建構函式呼叫建構函式示例C#函式
- C++ 類建構函式和解構函式C++函式
- JavaScript 建構函式JavaScript函式
- 建構函式、this、static函式
- 虛解構函式(√)、純虛解構函式(√)、虛建構函式(X)函式
- C/C++——建構函式、複製建構函式和解構函式的執行時刻C++函式
- PHP筆記:建構函式與解構函式PHP筆記函式
- js函式中的this指向JS函式
- 指向函式的指標函式指標
- 【C++】初始化列表建構函式VS普通建構函式C++函式
- C++語言之結構體、類、建構函式、拷貝建構函式C++結構體函式
- C++中建構函式,拷貝建構函式和賦值函式的詳解C++函式賦值
- 建構函式建立物件函式物件
- JavaScript Date()建構函式JavaScript函式
- 11-建構函式函式
- 建構函式詳解函式
- javascript Function()建構函式JavaScriptFunction函式
- 【C++】建構函式C++函式
- C++建構函式C++函式
- 3.建構函式函式
- Java的建構函式Java函式
- 拷貝建構函式函式
- 建構函式的作用函式
- 初識建構函式函式
- 關於建構函式與解構函式的分享函式
- C++入門記-建構函式和解構函式C++函式
- [C++]顯示呼叫建構函式和解構函式C++函式