ES5和ES6中繼承的不同之處
1膀藐、JS中視沒(méi)有繼承的朝捆,不過(guò)可以通過(guò)構(gòu)造函數(shù)或是原型等實(shí)現(xiàn)繼承谢谦,ES5實(shí)現(xiàn)繼承的方法——構(gòu)造函數(shù)孩饼,當(dāng)一個(gè)構(gòu)造函數(shù)加上new的時(shí)候都做了些什么呢?
(1)生成一個(gè)空對(duì)象并將其作為this
(2)將空對(duì)象的proto指向構(gòu)造函數(shù)的prototype
(3)運(yùn)行該構(gòu)造函數(shù)
(4)如果構(gòu)造函數(shù)沒(méi)有 return 或者 return 一個(gè)返回 this 值是基本類型才写,則返回this葡兑;如果 return 一個(gè)引用類型,則返回這個(gè)引用類型
2赞草、ES6中的constructor()和super()
(1)constructor()——構(gòu)造方法:這是ES6對(duì)類(class)的默認(rèn)方法讹堤,通過(guò)new命令生成對(duì)象實(shí)例時(shí)自動(dòng)調(diào)用該方法,并且該方法是類中必須有的厨疙,如果沒(méi)有顯示定義洲守,則會(huì)默認(rèn)添加空的constructor()方法
(2)super()——繼承:在class方法中,繼承是使用 extends 關(guān)鍵字來(lái)實(shí)現(xiàn)的沾凄。子類 必須 在 constructor( )調(diào)用 super( )方法梗醇,否則新建實(shí)例時(shí)會(huì)報(bào)錯(cuò)。原因在于:子類是沒(méi)有自己的 this 對(duì)象的撒蟀,它只能繼承自父類的 this 對(duì)象叙谨,然后對(duì)其進(jìn)行加工,而super( )就是將父類中的this對(duì)象繼承給子類的牙肝。沒(méi)有 super,子類就得不到 this 對(duì)象。
總結(jié):在ES5的繼承中配椭,先創(chuàng)建子類的實(shí)例對(duì)象this虫溜,然后再將父類的方法添加到this上( Parent.apply(this) )。而ES6采用的是先創(chuàng)建父類的實(shí)例this(故要先調(diào)用 super( )方法)股缸,完后再用子類的構(gòu)造函數(shù)修改this衡楞。
3、super(props)------super()的區(qū)別:
(1)如果用到了constructor就必須寫super()敦姻,是用來(lái)初始化this的瘾境,可以綁定事件到this上;
(2)如果在constructor中要使用this.props,就必須給super加參數(shù):super(props)镰惦;
(3)無(wú)論有沒(méi)有constructor迷守,在render中this.props都是可以使用的,這是React自動(dòng)附帶的旺入;
(4)如果沒(méi)用到constructor兑凿,是可以不寫的,React會(huì)默認(rèn)添加一個(gè)空的constructor茵瘾。