最近在研究javascript原型鏈繼承這一塊碰到一個(gè)細(xì)節(jié)問(wèn)題,引起了我的好奇,但是一直想不明白是為什么,請(qǐng)求大神解答:functionShape(){this.name='shape';this.toString=function(){returnthis.name;}}functionTwoDShape(){this.name='2dshape'}functionTriangle(side,height){this.name='triangle';this.side=side;this.height=height;this.getArea=function(){returnthis.side*this.height/2;}}Triangle.prototype=newTwoDShape();TwoDShape.prototype=newShape();Triangle.prototype.constructor=Triangle;TwoDShape.prototype.constructor=TwoDShape;如上段代碼所示,我建立了一個(gè)繼承鏈,從Shape到TwoDShape,再由TwoDShape到Triangle,當(dāng)我再執(zhí)行以下代碼時(shí):varshape1=newTriangle(10,9);console.log(TwoDShape.prototype.isPrototypeOf(shape1));//輸出false程序輸出false,我的理解,是isPrototypeOf尋找的是shape1最直接的那個(gè)原型,即Triangle.prototype,而這里TwoDShape.prototype不是其直接原型,所以輸出了false;然鵝,我在《javascript面向?qū)ο缶幊讨改稀愤@本書(shū)上看到的實(shí)踐則恰恰相反:書(shū)上在實(shí)現(xiàn)繼承時(shí)是這樣做的:functionShape(){}Shape.prototype.name='shape';Shape.prototype.toString=function(){returnthis.name;}functionTwoDShape(){};TwoDShape.prototype=newShape();TwoDShape.prototype.constructor=TwoDShape;TwoDShape.prototype.name='2dshape';functionTriangle(side,height){this.side=side;this.height=height;}Triangle.prototype=newTwoDShape();Triangle.prototype.constructor=Triangle;Triangle.prototype.name='triangle';Triangle.prototype.getArea=function(){returnthis.side*this.height/2;}在執(zhí)行了這段代碼后再console.log(TwoDShape.prototype.isPrototypeOf(shape1));此時(shí)則會(huì)輸出true,我不明白的,是這兩種繼承方式,不都是通過(guò)原型鏈繼承嗎?為什么兩者在這個(gè)點(diǎn)上的輸出會(huì)不一樣呢?我還有個(gè)問(wèn)題,就是在學(xué)習(xí)javascript時(shí)常常碰到這樣理解起來(lái)很匪夷所思的問(wèn)題,應(yīng)該怎樣更好的理解這門(mén)語(yǔ)言呢?
一個(gè)關(guān)于原型鏈繼承的基礎(chǔ)問(wèn)題
動(dòng)漫人物
2019-05-24 18:33:08