最近在研究javascript原型链继承这一块碰到一个细节问题,引起了我的好奇,但是一直想不明白是为什么,请求大神解答: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;如上段代码所示,我建立了一个继承链,从Shape到TwoDShape,再由TwoDShape到Triangle,当我再执行以下代码时:varshape1=newTriangle(10,9);console.log(TwoDShape.prototype.isPrototypeOf(shape1));//输出false程序输出false,我的理解,是isPrototypeOf寻找的是shape1最直接的那个原型,即Triangle.prototype,而这里TwoDShape.prototype不是其直接原型,所以输出了false;然鹅,我在《javascript面向对象编程指南》这本书上看到的实践则恰恰相反:书上在实现继承时是这样做的: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;}在执行了这段代码后再console.log(TwoDShape.prototype.isPrototypeOf(shape1));此时则会输出true,我不明白的,是这两种继承方式,不都是通过原型链继承吗?为什么两者在这个点上的输出会不一样呢?我还有个问题,就是在学习javascript时常常碰到这样理解起来很匪夷所思的问题,应该怎样更好的理解这门语言呢?
幕布斯6054654
相关分类