书中讲动态原型继承实现继承,给了一段错误代码
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对象不会对该对象产生任何影响.只有未来的对象(第二个以后的对象)实例才会反映出这种改变,这就使第一个实例变得不正确。
为什么技术上,对象被实例化?这段没看懂
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
第一次 ri = new Triangle 中 this 的 prototype 为原本的 Triangle.prototype
但中途又改了 Triangle.prototype
之后其实就会 false === ri instanceof Triangle
请参考原型链的解释
推荐你看下一篇经典的介绍javascript的原型链的博文,很有深度又感觉通俗易懂.我原先对这个概念也很模糊,看过该文以后,基本有了一个清晰的认识,通过几天的深入理解,可以说现在基本掌握了。
这个关键的概念只要你懂了,基本其它的也就很容易懂了。好好阅读下吧,链接在下面:
深入理解javacript之prototype