React.createClass中console.log(this)結果是Coustructor?
這個this是方法調用模式,指向構造函數本身。
結果出現的Constructor對象是什麼呢?就是構造出來的實例嗎?舉個簡單的栗子
const CommentList = React.createClass({
componentDidMount() {
console.log(this);
},
render() {
return (
&
Hello, world! I am a CommentList.
&
}
});
謝邀
首先你題目里的現象是錯的,結論也是錯的。當 componentDidMount() 被調用時,函數內部的 this 是實例,而非構造函數。
React.createClass() 是工廠函數,返回值是 class (構造函數)。
React.createClass() 創建出來的 class 有 auto bind 功能,會把參數中的函數成員綁定到 class 實例上,有如下結論:
const CommentList = React.createClass({
componentDidMount() {
console.dir(this); // instance
console.log(this instanceof CommentList); // true
},
returnThis(){
return this;
},
render() {
return (
&
Hello, world! I am a CommentList.
&
}
});
let a = new CommentList()
console.log(a.returnThis() === a); // true
let returnThis = a.returnThis;
console.log(returnThis() === a); // true
因此在 React 里,我們可以把被 auto bind 過的函數傳給別的組件,當這些函數被調用時可以保證其中的 this 始終是當前實例。
React ES6 starter
而 ES6 Class 就沒有 auto bind 了,如果你需要把某個函數傳給別人,需要自己手動 bind
class Test extends React.Component{
notBound(e){
e.preventDefault();
console.log(this instanceof Test); // false
}
bound = (e)=&> {
e.preventDefault();
console.log(this instanceof Test); // true
};
render(){
return (
&
Click or right click me and see the console.
&
}
}
React ES6 starter
註:文中的例子需要 babel react+stage0 配置。推薦閱讀:
※為什麼 React 推崇 HOC 和組合的方式,而不是繼承的方式來擴展組件?
※說說對react中JSX語法的理解?
※前端發展太快,有些小伙只會用react(了解api),招個jquery熟練的外包較難,如何看?
※請問react中有什麼好用的ui庫嗎?
※react服務端渲染如何將數據同步到客戶端?
TAG:React |