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 相关文章推荐
document.designMode的功能与使用方法介绍
Nov 22 Javascript
解决html按钮切换绑定不同函数后点击时执行多次函数问题
May 14 Javascript
jquery插件uploadify实现带进度条的文件批量上传
Dec 13 Javascript
jQuery Ajax 异步加载显示等待效果代码分享
Aug 01 Javascript
浅析js的模块化编写 require.js
Dec 07 Javascript
Javascript(es2016) import和require用法和区别详解
Aug 11 Javascript
JS一个简单的注册页面实例
Sep 05 Javascript
Node.js使用Express.Router的方法
Nov 14 Javascript
layui实现点击按钮给table添加一行
Aug 10 Javascript
js实现踩五彩块游戏
Feb 08 Javascript
Auto.JS实现抖音刷宝等刷视频app,自动点赞,自动滑屏,自动切换视频功能
May 08 Javascript
vue组件系列之TagsInput详解
May 14 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 和 MySQL 基础教程(三)
2006/10/09 PHP
PHP4实际应用经验篇(1)
2006/10/09 PHP
apache rewrite_module模块使用教程
2008/01/10 PHP
PHP开发环境配置(MySQL数据库安装图文教程)
2010/04/28 PHP
分享一下贝贝成长进度的php代码
2012/09/14 PHP
PHP.vs.JAVA
2016/04/29 PHP
PHP使用Redis实现Session共享的实现示例
2019/05/12 PHP
JavaScript入门教程(12) js对象化编程
2009/01/31 Javascript
为jquery.ui.dialog 增加“在当前鼠标位置打开”的功能
2009/11/24 Javascript
js以对象为索引的关联数组
2010/07/04 Javascript
JSONP 跨域访问代理API-yahooapis实现代码
2012/12/02 Javascript
Jquery中使用setInterval和setTimeout的方法
2013/04/08 Javascript
使用nodejs、Python写的一个简易HTTP静态文件服务器
2014/07/18 NodeJs
JavaScript函数模式详解
2014/11/07 Javascript
PHP实现的各种中文编码转换类分享
2015/01/23 Javascript
用JavaScript显示浏览器客户端信息的超相近教程
2015/06/18 Javascript
Jquery基础之事件操作详解
2016/06/14 Javascript
微信小程序 rpx 尺寸单位详细介绍
2016/10/13 Javascript
vue使用localStorage保存登录信息 适用于移动端、PC端
2019/05/27 Javascript
[03:55]2014DOTA2国际邀请赛 Fnatic经理采访赢DK在情理之中
2014/07/10 DOTA
Python常用算法学习基础教程
2017/04/13 Python
Python3安装Scrapy的方法步骤
2017/11/23 Python
python编程实现12306的一个小爬虫实例
2017/12/27 Python
python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代码详解
2018/04/19 Python
python中实现字符串翻转的方法
2018/07/11 Python
使用EduBlock轻松学习Python编程
2018/10/08 Python
Mankind西班牙男士护肤品网站:购买皮肤护理、护发和剃须
2017/04/27 全球购物
活动总结模板
2014/05/09 职场文书
公司总经理助理岗位职责
2014/07/09 职场文书
判缓刑人员个人思想汇报
2014/10/10 职场文书
募捐感谢信
2015/01/22 职场文书
机器人瓦力观后感
2015/06/12 职场文书
新娘父亲婚礼致辞
2015/07/27 职场文书
新郎结婚感言
2015/07/31 职场文书
JS实现九宫格拼图游戏
2022/06/28 Javascript
Nginx报404错误的详细解决方法
2022/07/23 Servers