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 相关文章推荐
解决iframe的frameborder在chrome/ff/ie下的差异
Aug 12 Javascript
网络之美 JavaScript中Get和Set访问器的实现代码
Sep 19 Javascript
jQuery帮助之筛选查找 children([expr])
Jan 31 Javascript
Jquery利用mouseenter和mouseleave实现鼠标经过弹出层且可以点击
Feb 12 Javascript
JSON中双引号的轮回使用过程中一定要小心
Mar 05 Javascript
JQuery EasyUI Layout 在from布局自适应窗口大小的实现方法
May 28 Javascript
类似于QQ的右滑删除效果的实现方法
Oct 16 Javascript
jQuery实现web页面樱花坠落的特效
Jun 01 jQuery
JS实现按钮颜色切换效果
Sep 05 Javascript
webpack4手动搭建Vue开发环境实现todoList项目的方法
May 16 Javascript
layui 解决富文本框form表单提交为空的问题
Oct 26 Javascript
Vue的生命周期一起来看看
Feb 24 Vue.js
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
thinkphp3.0输出重复两次的解决方法
2014/12/19 PHP
php模拟post提交数据的方法
2015/02/12 PHP
yii2 上传图片的示例代码
2018/11/02 PHP
使用prototype.js进行异步操作
2007/02/07 Javascript
用dom+xhtml+css制作的一个相册效果代码打包下载
2008/01/24 Javascript
解析javascript 数组以及json元素的添加删除
2013/06/26 Javascript
关于jquery中全局函数each使用介绍
2013/12/10 Javascript
JQuery以JSON方式提交数据到服务端示例代码
2014/05/05 Javascript
js 数组去重的四种实用方法
2014/09/09 Javascript
js实现类似jquery里animate动画效果的方法
2015/04/10 Javascript
Jquery和BigFileUpload实现大文件上传及进度条显示
2016/06/27 Javascript
JS图片等比例缩放方法完整示例
2016/08/03 Javascript
javascript经典特效分享 手风琴、轮播图、图片滑动
2016/09/14 Javascript
jQuery Checkbox 全选 反选的简单实例
2016/11/29 Javascript
微信小程序 template模板详解及实例代码
2017/03/09 Javascript
angularjs的select使用及默认选中设置
2017/04/08 Javascript
浅谈vue首屏加载优化
2018/06/28 Javascript
基于vue中keep-alive缓存问题的解决方法
2018/09/21 Javascript
一文快速了解JQuery中的AJAX
2019/05/31 jQuery
小程序开发之模态框组件封装
2020/04/23 Javascript
vue 通过绑定事件获取当前行的id操作
2020/07/27 Javascript
Echarts.js无法引入问题解决方案
2020/10/30 Javascript
vue中echarts的用法及与elementui-select的协同绑定操作
2020/11/17 Vue.js
[04:19]DOTA2亚洲邀请赛 现场花絮
2015/03/11 DOTA
10个Python小技巧你值得拥有
2018/09/29 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
2019/05/27 Python
python3读取autocad图形文件.py实例
2020/06/05 Python
La Redoute英国官网:法国时尚品牌
2017/04/27 全球购物
JSF界面控制层技术
2013/06/17 面试题
工地门卫岗位职责
2013/12/30 职场文书
养殖行业的创业计划书
2014/01/05 职场文书
小学运动会表扬稿
2014/01/19 职场文书
老人节标语大全
2014/10/08 职场文书
春节随笔
2015/08/15 职场文书
Flask response响应的具体使用
2021/07/15 Python