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 相关文章推荐
JS 页面内容搜索,类似于 Ctrl+F功能的实现代码
Aug 13 Javascript
用正则表达式 动态创建/增加css style script 兼容IE firefox
Mar 10 Javascript
jquery 元素相对定位代码
Oct 15 Javascript
jQuery UI Autocomplete 1.8.16 中文输入修正代码
Apr 16 Javascript
JS实现统计复选框选中个数并提示确定与取消的方法
Jul 01 Javascript
JS实现线性表的顺序表示方法示例【经典数据结构】
Apr 11 Javascript
vue-router 导航钩子的具体使用方法
Aug 31 Javascript
vue2.0 常用的 UI 库实例讲解
Dec 12 Javascript
vue计算属性和监听器实例解析
May 10 Javascript
vue组件间通信六种方式(总结篇)
May 15 Javascript
微信小程序canvas截取任意形状的实现代码
Jan 13 Javascript
基于JS实现视频上传显示进度条
May 12 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
php查询mssql出现乱码的解决方法
2014/12/29 PHP
Javascript 遍历对象中的子对象
2009/07/03 Javascript
如何确保JavaScript的执行顺序 之jQuery.html并非万能钥匙
2011/03/03 Javascript
Javascript之this关键字深入解析
2013/11/12 Javascript
根据身份证号自动输出相关信息(籍贯,出身日期,性别)
2013/11/15 Javascript
提取jquery的ready()方法单独使用示例
2014/03/25 Javascript
教你如何自定义百度分享插件以及bshare分享插件的分享按钮
2014/06/20 Javascript
js实现字符串和数组之间相互转换操作
2016/01/12 Javascript
深入理解JS DOM事件机制
2016/08/06 Javascript
JS如何设置iOS中微信浏览器的title
2016/11/22 Javascript
jQuery实现动态添加、删除按钮及input输入框的方法
2017/04/27 jQuery
基于nodejs+express4.X实现文件下载的实例代码
2017/07/13 NodeJs
浅谈JsonObject中的key-value数据解析排序问题
2017/12/06 Javascript
Angular PWA使用的Demo示例
2019/01/31 Javascript
Vue.js特性Scoped Slots的浅析
2019/02/20 Javascript
js实现拾色器插件(ColorPicker)
2020/05/21 Javascript
JS typeof fn === 'function' && fn()详解
2020/08/22 Javascript
Map与WeakMap类型在JavaScript中的使用详解
2020/11/18 Javascript
Django接受前端数据的几种方法总结
2016/11/04 Python
Python matplotlib画图实例之绘制拥有彩条的图表
2017/12/28 Python
Python零基础入门学习之输入与输出
2019/04/03 Python
python 通过视频url获取视频的宽高方式
2019/12/10 Python
Python3实现飞机大战游戏
2020/04/24 Python
Pycharm github配置实现过程图解
2020/10/13 Python
OpenCV+Python3.5 简易手势识别的实现
2020/12/21 Python
CSS3的column-fill属性对齐列内容高度的用法详解
2016/07/01 HTML / CSS
详解canvas drawImage()方法绘制图片不显示的问题
2018/10/08 HTML / CSS
软件测试面试题
2014/01/05 面试题
新闻网站实习自我鉴定
2013/09/25 职场文书
学生手册家长评语
2014/02/10 职场文书
最经典的商业地产项目广告词
2014/03/13 职场文书
英语一分钟演讲稿
2014/04/29 职场文书
2015年团队工作总结范文
2015/05/04 职场文书
地道战观后感400字
2015/06/04 职场文书
2016高校自主招生自荐信范文
2016/01/28 职场文书
深入解析Apache Hudi内核文件标记机制
2022/03/31 Servers