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 相关文章推荐
JavaScript中的其他对象
Jan 16 Javascript
图像替换新技术 状态域方法
Jan 28 Javascript
Javascript异步表单提交,图片上传,兼容异步模拟ajax技术
May 10 Javascript
基于jquery的滑动样例代码
Nov 20 Javascript
js中巧用cssText属性批量操作样式
Mar 13 Javascript
javascript 系统文件夹文件操作及参数介绍
Jan 08 Javascript
JavaScript Serializer序列化时间处理示例
Jul 31 Javascript
Javascript之面向对象--封装
Dec 02 Javascript
vue.js中proxyTable 转发请求的实现方法
Sep 20 Javascript
vue2.0+vue-router构建一个简单的列表页的示例代码
Feb 13 Javascript
使用typescript改造koa开发框架的实现
Feb 04 Javascript
利用vue3+ts实现管理后台(增删改查)
Oct 30 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
利用PHPExcel读取Excel的数据和导出数据到Excel
2017/05/12 PHP
Javascript中Eval函数的使用说明
2008/10/11 Javascript
比较全的JS checkbox全选、取消全选、删除功能代码
2008/12/19 Javascript
屏蔽F1~F12的快捷键的js函数
2010/05/06 Javascript
基于jquery实现的移入页面上空文本框时,让它变为焦点,移出清除焦点
2011/07/26 Javascript
学习从实践开始之jQuery插件开发 菜单插件开发
2012/05/03 Javascript
jquery事件与函数的使用介绍
2013/09/29 Javascript
nodejs爬虫抓取数据乱码问题总结
2015/07/03 NodeJs
javascript宿主对象之window.navigator详解
2016/09/07 Javascript
微信小程序实现下拉刷新和轮播图效果
2017/11/21 Javascript
详细分析单线程JS执行问题
2017/11/22 Javascript
JS中使用textPath实现线条上的文字
2017/12/25 Javascript
使用use注册Vue全局组件和全局指令的方法
2018/03/08 Javascript
微信开发之微信jssdk录音功能开发示例
2018/10/22 Javascript
php结合js实现多条件组合查询
2019/05/28 Javascript
vue基本使用--refs获取组件或元素的实例
2019/11/07 Javascript
JavaScript实现打字游戏
2021/02/19 Javascript
python实现通过代理服务器访问远程url的方法
2015/04/29 Python
两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法
2019/03/05 Python
Python函数定义及传参方式详解(4种)
2019/03/18 Python
详解python多线程之间的同步(一)
2019/04/03 Python
python和c语言的主要区别总结
2019/07/07 Python
详解Pandas之容易让人混淆的行选择和列选择
2019/07/10 Python
python3 map函数和filter函数详解
2019/08/26 Python
Python getattr()函数使用方法代码实例
2020/08/10 Python
CSS3 Media Queries详细介绍和使用实例
2014/05/08 HTML / CSS
MyFrenchPharma中文网:最大的法国药妆平台
2016/10/07 全球购物
欧洲最大的美妆零售网站:Feelunique
2017/01/14 全球购物
PHP面试题附答案
2015/11/28 面试题
教师申诉制度
2014/01/29 职场文书
小学生演讲稿大全
2014/04/25 职场文书
大三学习计划书范文
2014/05/02 职场文书
爱心捐款倡议书范文
2014/05/12 职场文书
中层干部考核评语
2015/01/04 职场文书
2015年实习生工作总结报告
2015/04/28 职场文书
Java 深入探究讲解简单工厂模式
2022/04/07 Java/Android