源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

javascript原型链继承用法实例分析

  • 时间:2022-02-21 02:34 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:javascript原型链继承用法实例分析
本文实例分析了javascript原型链继承的用法。分享给大家供大家参考。具体分析如下:
[u]复制代码[/u] 代码如下:
function Shape(){   this.name = 'shape';   this.toString = function(){    return this.name;   }  }    function TwoDShape(){   this.name = '2D shape';  }  function Triangle(side,height){   this.name = 'Triangle';   this.side = side;   this.height = height;   this.getArea = function(){    return this.side*this.height/2;   };  }    /* inheritance */  TwoDShape.prototype = new Shape();  Triangle.prototype = new TwoDShape();
当我们对对象的prototype属性进行完全重写时,有时候会对对象constructor属性产生一定的负面影响。 所以,在我们完成相关的继承关系设定后,对这些对象的const属性进行相应的重置是一个非常好的习惯。如下所示:
[u]复制代码[/u] 代码如下:
TwoDShape.prototype.constructor = TwoDShape;  Triangle.prototype.constructor = Triangle;
改写:
[u]复制代码[/u] 代码如下:
function Shape(){}    Shape.prototype.name = 'shape';  Shape.prototype.toString = function(){   return this.name;  }    function TwoDShape(){}    TwoDShape.prototype = new Shape();  TwoDShape.prototype.constructor = TwoDShape;    TwoDShape.prototype.name = '2d shape';    function Triangle(side,height){   this.side = side;   this.height = height;  }    Triangle.prototype = new TwoDShape;  Triangle.prototype.constructor = Triangle;    Triangle.prototype.name = 'Triangle';  Triangle.prototype.getArea = function(){   return this.side*this.height/2;  }
再改写(引用传递而不是值传递):
[u]复制代码[/u] 代码如下:
function Shape(){}    Shape.prototype.name = 'shape';  Shape.prototype.toString = function(){   return this.name;  }    function TwoDShape(){}    TwoDShape.prototype = Shape.prototype;  TwoDShape.prototype.constructor = TwoDShape;    TwoDShape.prototype.name = '2d shape';    function Triangle(side,height){   this.side = side;   this.height = height;  }    Triangle.prototype = TwoDShape.prototype;  Triangle.prototype.constructor = Triangle;    Triangle.prototype.name = 'Triangle';  Triangle.prototype.getArea = function(){   return this.side*this.height/2;  }
虽然提高了效率,但是这样的方法有个副作用,因为是引用传递,而不是值传递,所以“父对象”中的name值受到了影响。 子对象和父对象指向的是同一个对象。所以一旦子对象对其原型进行修改,父对象也会随即被改变。 再再改写(使用临时构造器):
[u]复制代码[/u] 代码如下:
function Shape(){}  Shape.prototype.name = 'shape';  Shape.prototype.toString = function(){   return this.name;  }  function TwoDShape(){}  var F = function(){}  F.prototype = Shape.prototype;  TwoDShape.prototype = new F();  TwoDShape.prototype.constructor = TwoDShape;  TwoDShape.prototype.name = '2d shape';  function Triangle(side,height){   this.side = side;   this.height = height;  }  F.prototype = TwoDShape.prototype;  Triangle.prototype = new F();  Triangle.prototype.constructor = Triangle;  Triangle.prototype.name = 'Triangle';  Triangle.prototype.getArea = function(){   return this.side*this.height/2;  }
虽然提高了效率,但是这样的方法有个副作用,因为是引用传递,而不是值传递,所以“父对象”中的name值受到了影响。 子对象和父对象指向的是同一个对象。所以一旦子对象对齐原型进行修改,父对象也会随即被改变。 希望本文所述对大家的javascript程序设计有所帮助。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部