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


Posted in Javascript onJanuary 28, 2015

本文实例分析了javascript原型链继承的用法。分享给大家供大家参考。具体分析如下:

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属性进行相应的重置是一个非常好的习惯。如下所示:

TwoDShape.prototype.constructor = TwoDShape;  

Triangle.prototype.constructor = Triangle;

改写:

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;  

}

再改写(引用传递而不是值传递):

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值受到了影响。
子对象和父对象指向的是同一个对象。所以一旦子对象对其原型进行修改,父对象也会随即被改变。

再再改写(使用临时构造器):

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程序设计有所帮助。

Javascript 相关文章推荐
最新的10款jQuery内容滑块插件分享
Sep 18 Javascript
javascript 中String.match()与RegExp.exec()的区别说明
Jan 10 Javascript
javascript 常见功能汇总
Jun 11 Javascript
JS实现的自定义显示加载等待图片插件(loading.gif)
Jun 17 Javascript
JavaScript获取css行间样式,内连样式和外链样式的简单方法
Jul 18 Javascript
JavaScript选取(picking)和反选(rejecting)对象的属性方法
Aug 16 Javascript
聊聊Vue中provide/inject的应用详解
Nov 10 Javascript
Vue列表循环从指定下标开始的多种解决方案
Apr 08 Javascript
vuex实现购物车的增加减少移除
Jun 28 Javascript
js实现弹幕飞机效果
Aug 27 Javascript
用vue设计一个日历表
Dec 03 Vue.js
如何用JavaScipt测网速
May 09 Javascript
Jquery 实现图片轮换
Jan 28 #Javascript
javascript查询字符串参数的方法
Jan 28 #Javascript
Jquery 实现弹出层插件
Jan 28 #Javascript
jQuery动画出现连续触发、滞后反复执行的解决方法
Jan 28 #Javascript
Jquery 实现table样式的设定
Jan 28 #Javascript
Jquery 实现checkbox全选方法
Jan 28 #Javascript
AngularJS实现表单验证
Jan 28 #Javascript
You might like
《Re:从零开始的异世界生活》剧情体验,手游新作定名
2020/04/09 日漫
动态新闻发布的实现及其技巧
2006/10/09 PHP
C# Assembly类访问程序集信息
2009/06/13 PHP
php读取图片内容并输出到浏览器的实现代码
2013/08/08 PHP
PHP无限分类(树形类)
2013/09/28 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
一个网马的tips实现分析
2010/11/28 Javascript
js兼容的placeholder属性详解
2013/08/18 Javascript
文本有关的样式和jQuery求对象的高宽问题分别说明
2013/08/30 Javascript
jQuery1.9.1针对checkbox的调整方法(prop)
2014/05/01 Javascript
js实现简单秒表走动的时钟特效
2020/03/25 Javascript
AngularJS中如何使用$http对MongoLab数据表进行增删改查
2016/01/23 Javascript
JS实现的tab切换选项卡效果示例
2017/02/28 Javascript
详解ES6之async+await 同步/异步方案
2017/09/19 Javascript
jQuery pagination分页示例详解
2018/10/23 jQuery
JavaScript使用小插件实现倒计时的方法讲解
2019/03/11 Javascript
vue 微信分享回调iOS和安卓回调出现错误的解决
2020/09/07 Javascript
Python实现的HTTP并发测试完整示例
2020/04/23 Python
Python实现大文件排序的方法
2015/07/10 Python
Win10下安装并使用tensorflow-gpu1.8.0+python3.6全过程分析(显卡MX250+CUDA9.0+cudnn)
2020/02/17 Python
浅谈pytorch torch.backends.cudnn设置作用
2020/02/20 Python
Python利用pip安装tar.gz格式的离线资源包
2020/09/14 Python
Window10上Tensorflow的安装(CPU和GPU版本)
2020/12/15 Python
css3.0 图形构成实例练习二
2013/03/19 HTML / CSS
英语简历自我评价
2014/01/26 职场文书
大学生2014全国两会学习心得体会
2014/03/10 职场文书
电子专业求职信
2014/06/19 职场文书
员工激励培训演讲稿
2014/09/16 职场文书
2014第二批党的群众路线教育实践活动对照检查材料思想汇报
2014/09/18 职场文书
会议接待欢迎词范文
2015/01/26 职场文书
签订劳动合同通知书
2015/04/16 职场文书
行政处罚告知书
2015/07/01 职场文书
各类场合主持词开场白范文集锦
2019/08/16 职场文书
写作之关于描写老人的好段摘抄
2019/11/14 职场文书
Redis 报错 error:NOAUTH Authentication required
2022/05/15 Redis
JS前端canvas交互实现拖拽旋转及缩放示例
2022/08/05 Javascript