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 相关文章推荐
jQuery中文入门指南,翻译加实例,jQuery的起点教程
Jan 13 Javascript
JavaScript效率调优经验
Jun 04 Javascript
JavaScript自定义方法实现trim()、Ltrim()、Rtrim()的功能
Nov 03 Javascript
jQuery链使用指南
Jan 20 Javascript
基于jquery实现智能提示控件intellSeach.js
Mar 17 Javascript
基于MVC+EasyUI的web开发框架之使用云打印控件C-Lodop打印页面或套打报关运单信息
Aug 29 Javascript
js控制台输出的方法(详解)
Nov 26 Javascript
Bootstrap模态框案例解析
Mar 05 Javascript
ReactNative Image组件使用详解
Aug 07 Javascript
layui table复选框禁止某几条勾选的实例
Sep 20 Javascript
ligerUI的ligerDialog关闭刷新的方法
Sep 27 Javascript
jQuery实现鼠标放置名字上显示详细内容气泡提示框效果的方法分析
Apr 04 jQuery
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中多维数组的foreach遍历示例
2014/06/13 PHP
浅谈laravel5.5 belongsToMany自身的正确用法
2019/10/17 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
jQuery EasyUI API 中文文档 可调整尺寸
2011/09/29 Javascript
js判断为空Null与字符串为空简写方法
2014/02/24 Javascript
TypeError document.getElementById(...) is null错误原因
2015/05/18 Javascript
在Linux系统中搭建Node.js开发环境的简单步骤讲解
2016/01/26 Javascript
由简入繁实现Jquery树状结构的方法(推荐)
2016/06/10 Javascript
jQuery实现的瀑布流加载效果示例
2016/09/13 Javascript
浅谈js中同名函数和同名变量的执行问题
2017/02/12 Javascript
100多个基础常用JS函数和语法集合大全
2017/02/16 Javascript
微信小程序图片自适应支持多图实例详解
2017/06/21 Javascript
浅谈Vue父子组件和非父子组件传值问题
2017/08/22 Javascript
Three.js如何实现雾化效果示例代码
2017/09/27 Javascript
ztree实现左边动态生成树右边为内容详情功能
2017/11/03 Javascript
基于vue如何发布一个npm包的方法步骤
2019/05/15 Javascript
原生javascript制作的拼图游戏实现方法详解
2020/02/23 Javascript
python自动翻译实现方法
2016/05/28 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
2017/04/05 Python
python with提前退出遇到的坑与解决方案
2018/01/05 Python
python文本数据相似度的度量
2018/03/12 Python
python Selenium实现付费音乐批量下载的实现方法
2019/01/24 Python
django-rest-swagger的优化使用方法
2019/08/29 Python
使用Python构造hive insert语句说明
2020/06/06 Python
结束运行python的方法
2020/06/16 Python
Python的控制结构之For、While、If循环问题
2020/06/30 Python
html+js 实现markdown编辑器效果
2019/10/23 HTML / CSS
C语言50道问题
2014/10/23 面试题
灵泰克Java笔试题
2016/01/09 面试题
业务副厂长岗位职责
2014/01/03 职场文书
手机促销活动方案
2014/02/05 职场文书
地理教师岗位职责
2014/03/16 职场文书
离婚协议书范本及离婚须知
2014/10/15 职场文书
2014群众路线学习笔记
2014/11/06 职场文书
Python还能这么玩之用Python修改了班花的开机密码
2021/06/04 Python
Python函数中的不定长参数相关知识总结
2021/06/24 Python