书中讲动态原型继承实现继承,给了一段错误代码
function Polygon(sides){ this.sides = sides; if(typeof Polygon._initialized == "undefined"){ Polygon.prototype.getName = function(){ return "dash"; } alert(Polygon._initialized); Polygon._initialized = true; } } function Triangle(base, height){ Polygon.call(this,3); this.base = base; this.height = height; if(typeof Triangle._initialized == "undefined"){ **Triangle.prototype = new Polygon();** Triangle.prototype.getArea = function(){ return 0.5 * this.base * this.height; } Triangle._initialized = true; } } window.onload = function(){ var ri = new Triangle(10,20); var tri = new Triangle(20,40); alert(ri.getArea()); alert(ri.getName()); alert(ri.sides); alert(tri.getArea()); alert(tri.getName()); alert(tri.sides); }
粗体部分的代码有错,书中原文解释:从逻辑上讲,这个位置是正确的,但从功能上讲,却是无效的.从技术上 说,在代码运行前,对象已经被实例化,并与原始的prototype对象联系在一起了.虽然用极晚绑定可使对原型对象的修改正确地反映出来,但替换 prototype对象不会对该对象产生任何影响.只有未来的对象(第二个以后的对象)实例才会反映出这种改变,这就使第一个实例变得不正确。
为什么技术上,对象被实例化?这段没看懂
巴扎黑2017-04-10 12:46:36
第一次 ri = new Triangle 中 this 的 prototype 为原本的 Triangle.prototype
但中途又改了 Triangle.prototype
之后其实就会 false === ri instanceof Triangle
请参考原型链的解释
PHP中文网2017-04-10 12:46:36
推荐你看下一篇经典的介绍javascript的原型链的博文,很有深度又感觉通俗易懂.我原先对这个概念也很模糊,看过该文以后,基本有了一个清晰的认识,通过几天的深入理解,可以说现在基本掌握了。
这个关键的概念只要你懂了,基本其它的也就很容易懂了。好好阅读下吧,链接在下面:
深入理解javacript之prototype