如上圖:類Child是經過class關鍵字申明,而且繼承於類React。html
A、Child的類型是? typeof Child === 'function' , 其實就至關於ES5用function申明的構造函數 function Child() { //申明構造函數 }react
B、Child類調用時候( new Child() ),會優先執行,而且自動執行Child的constructor函數。es6
constructor() { console.log('執行了constructor') return 'hah' } getName() { console.log('執行了方法') } } var dd = new Person(); console.log(dd)
打印以下:函數
三、Child類中的this? this指向Child的實例,至關於 new Child() 那麼它們徹底相等嗎? 不是的,react中的this是在new Child()基礎上進行了包裹(下圖)。post
上圖爲new Child() 下圖爲 Child中的thisthis
結論:this是在new Child()基礎上進行了包裹,包含了一些react內部方法,url
同時組件中使用Child類( <div> <Child /> </div> ),能夠當作 new Child() + react包裹。(細節待追究。。。)spa
ES6的知識補充: http://es6.ruanyifeng.com/#docs/class-extends 以下:code
class ColorPoint extends Point { } // 等同於 class ColorPoint extends Point { constructor(...args) { super(...args); } }
// 可見沒有寫constructor,在執行過程當中會自動補上
由ES6的繼承規則得知,無論子類寫不寫constructor,在new實例的過程都會給補上constructor。component
因此:constructor鉤子函數並非不可缺乏的,子組件能夠在一些狀況略去。
接下來,繼續看下有沒有constructor鉤子函數有什麼區別:
A、先看有無constructor鉤子函數的 this.constructor
有constructor鉤子函數的 this.constructor
無constructor鉤子函數的 this.constructor
若是能看細節的話,會得知 有constructor鉤子函數時候,Child類會多一個constructor方法。
B、再看有無先看有無constructor鉤子函數的 this,也就是組件實例。
有constructor鉤子函數的 this實例。
無constructor鉤子函數的 this實例。
會得知 有constructor鉤子函數時候,能夠定義state,若是用戶不定義state的話,有無constructor鉤子函數時候沒有區別。
結論: 若是組件要定義本身的state初始狀態的話,須要寫在constructor鉤子函數中,
若是用戶不使用state的話,純用props接受參數,有沒有constructor鉤子函數均可以,能夠不用constructor鉤子函數。
再者若是不使用state,那麼爲何不使用 無狀態組件(建議使用) 呢???
有的小夥伴每次寫組件都會習慣性在constructor和super中寫上props,那麼這個是必要的嗎??
如圖:
首先要明確很重要的一點就是:
能夠不寫constructor,一旦寫了constructor,就必須在此函數中寫super(),
此時組件纔有本身的this,在組件的全局中均可以使用this關鍵字,
不然若是隻是constructor 而不執行 super() 那麼之後的this都是錯的!!!
來源ES6 : http://es6.ruanyifeng.com/#docs/class-extends
可是super中必須寫參數props嗎?? 答案是不必定,先看代碼:
有props:
無props:
能夠得出結論:當想在constructor中使用this.props的時候,super須要加入(props),
此時用props也行,用this.props也行,他倆都是一個東西。(不過props能夠是任意參數,this.props是固定寫法)。
如圖:
若是在custructor生命週期不使用 this.props或者props時候,能夠不傳入props。
下面是一個使用props的場景,此時別忘了 componentWillReceiveProps 生命週期喲。
參考另外一篇文章 react的生命週期須要知道的
接上:若是constructor中不經過super來接收props,在其餘生命週期,
諸如componentWillMount、componentDidMount、render中能直接使用this.props嗎??
結論:能夠的,react在除了constructor以外的生命週期已經傳入了this.props了,徹底不受super(props)的影響。
因此super中的props是否接收,只能影響constructor生命週期可否使用this.props,其餘的生命週期已默認存在this.props