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事件实现代码
Mar 12 Javascript
Jquery操作Select 简单方便 一个js插件搞定
Nov 12 Javascript
页面版文本框智能提示JS代码
Nov 20 Javascript
Javascript笔记一 js以及json基础使用说明
May 22 Javascript
javascript教程:关于if简写语句优化的方法
May 17 Javascript
3种js实现string的substring方法
Nov 09 Javascript
javascript函数命名的三种方式及区别介绍
Mar 22 Javascript
JS实现页面打印功能
Mar 16 Javascript
AngularJS实现页面跳转后自动弹出对话框实例代码
Aug 02 Javascript
基于JSON数据格式详解
Aug 31 Javascript
JavaScript实现手机号码 3-4-4格式并控制新增和删除时光标的位置
Jun 02 Javascript
一道JS算法面试题——冒泡、选择排序
Apr 21 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 中的面向对象编程:通向大型 PHP 工程的办法
2006/12/03 PHP
使用 MySQL 开始 PHP 会话
2006/12/21 PHP
有关JSON以及JSON在PHP中的应用
2010/04/09 PHP
如何使用PHP获取指定日期所在月的开始日期与结束日期
2013/08/01 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
PHP实现负载均衡的加权轮询方法分析
2018/08/22 PHP
JavaScript Object的extend是一个常用的功能
2009/12/02 Javascript
JQuery跨Iframe选择实现代码
2010/08/19 Javascript
javascript抖动元素的小例子
2013/10/28 Javascript
js简单实现交换Li的值
2014/05/22 Javascript
javascript实现漂亮的拖动层,窗口拖拽特效
2015/04/24 Javascript
js流动式效果显示当前系统时间
2016/05/16 Javascript
jQuery遍历json的方法(推荐)
2016/06/12 Javascript
关于input全选反选恶心的异常情况
2016/07/24 Javascript
JavaScript将base64图片转换成formData并通过AJAX提交的实现方法
2016/10/24 Javascript
Angular4自制一个市县二级联动组件示例
2017/11/21 Javascript
nodejs高大上的部署方式(PM2)
2018/09/11 NodeJs
微信小程序学习笔记之跳转页面、传递参数获得数据操作图文详解
2019/03/28 Javascript
[03:52]DOTA2英雄基础教程 酒仙
2013/12/23 DOTA
在cmd命令行里进入和退出Python程序的方法
2018/05/12 Python
python3使用flask编写注册post接口的方法
2018/12/28 Python
python 利用pyttsx3文字转语音过程详解
2019/09/25 Python
python生成特定分布数的实例
2019/12/05 Python
Python while循环使用else语句代码实例
2020/02/07 Python
keras自定义回调函数查看训练的loss和accuracy方式
2020/05/23 Python
HTML5的hidden属性兼容老浏览器的方法
2014/04/23 HTML / CSS
Html5应用程序缓存(Cache manifest)
2018/06/04 HTML / CSS
一站式跨境收款解决方案:Payoneer(派安盈)
2018/09/06 全球购物
关于是否需要写商业计划书
2014/02/07 职场文书
大学新生军训自我鉴定范文
2014/09/13 职场文书
2015年车间安全管理工作总结
2015/05/13 职场文书
婚庆开业庆典主持词
2015/06/30 职场文书
任命书格式模板
2015/09/22 职场文书
Pytorch中的数据集划分&正则化方法
2021/05/27 Python
CSS实现切角+边框+投影+内容背景色渐变效果
2021/11/01 HTML / CSS
python标准库ElementTree处理xml
2022/05/20 Python