您好,匿名用户
随意问技术百科期待您的加入

js动态原型实现继承 ----javascript高级程序设计一书中的问题

0 投票

书中讲动态原型继承实现继承,给了一段错误代码

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对象不会对该对象产生任何影响.只有未来的对象(第二个以后的对象)实例才会反映出这种改变,这就使第一个实例变得不正确。
为什么技术上,对象被实例化?这段没看懂

用户头像 提问 2014年 2月12日 @ Caster 上等兵 (256 威望)
分享到:

1个回答

0 投票
 
最佳答案

第一次 ri = new Triangle 中 this 的 prototype 为原本的 Triangle.prototype
但中途又改了 Triangle.prototype
之后其实就会 false === ri instanceof Triangle

请参考原型链的解释

用户头像 回复 2014年 2月12日 @ Morgana 上等兵 (251 威望)
选中 2013年 9月7日 @Caster
提一个问题:

相关问题

0 投票
1 回复 32 阅读
0 投票
1 回复 50 阅读
0 投票
1 回复 28 阅读
0 投票
1 回复 45 阅读

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...