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 相关文章推荐
关于event.cancelBubble和event.stopPropagation()的区别介绍
Dec 11 Javascript
基于JQuery的一句话搞定手风琴菜单
Sep 14 Javascript
jquery 操作css样式、位置、尺寸方法汇总
Nov 28 Javascript
8个超实用的jQuery功能代码分享
Jan 08 Javascript
JavaScript代码性能优化总结篇
May 15 Javascript
js获取json中key所对应的value值的简单方法
Jun 17 Javascript
JavaScript反弹动画效果的实现代码
Jul 13 Javascript
基于JavaScript实现数码时钟效果
Mar 30 Javascript
jQuery实现监听下拉框选中内容发生改变操作示例
Jul 13 jQuery
通过npm或yarn自动生成vue组件的方法示例
Feb 12 Javascript
浅入深出Vue之组件使用
Jul 11 Javascript
js实现复制粘贴的两种方法
Dec 04 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
一个颜色轮换的简单例子
2006/10/09 PHP
请php正则走开
2008/03/15 PHP
PHP查询快递信息的方法
2015/03/07 PHP
深入浅析php中sprintf与printf函数的用法及区别
2016/01/08 PHP
thinkPHP中配置的读取与C方法详解
2016/12/05 PHP
thinkphp 手机号和用户名同时登录
2017/01/20 PHP
浅析PHP类的反射来实现依赖注入过程
2018/02/06 PHP
JQuery获取或设置ckeditor的数据(示例代码)
2013/11/15 Javascript
javascript修改表格背景色实例代码分享
2013/12/10 Javascript
jQuery实现带延迟效果的滑动菜单代码
2015/09/02 Javascript
再谈Javascript中的基本类型和引用类型(推荐)
2016/07/01 Javascript
利用vue实现模态框组件
2016/12/19 Javascript
懒加载实现的分页&&网站footer自适应
2016/12/21 Javascript
详解原生js实现offset方法
2017/06/15 Javascript
BootStrap入门学习第一篇
2017/08/28 Javascript
vue cli 3.0 使用全过程解析
2018/06/14 Javascript
Node.js模拟发起http请求从异步转同步的5种用法
2018/09/26 Javascript
vue中的过滤器实例代码详解
2019/06/06 Javascript
python numpy实现文件存取的示例代码
2019/05/26 Python
手动安装python3.6的操作过程详解
2020/01/13 Python
Python 之 Json序列化嵌套类方式
2020/02/27 Python
python多维数组分位数的求取方式
2020/03/03 Python
python 星号(*)的多种用途
2020/09/21 Python
纯CSS3发光分享按钮的实现教程
2014/09/06 HTML / CSS
css3实例教程 一款纯css3实现的发光屏幕旋转特效
2014/12/07 HTML / CSS
详解Canvas事件绑定
2018/06/27 HTML / CSS
联想韩国官网:Lenovo Korea
2018/05/10 全球购物
表达自我的市场:Society6
2018/08/01 全球购物
快时尚眼镜品牌,全国连锁眼镜店:LOHO眼镜生活
2018/10/08 全球购物
Crocs波兰官方商店:女鞋、男鞋、童鞋、洞洞鞋
2019/10/08 全球购物
请写出 BOOL flag 与"零值"比较的 if 语句
2016/02/29 面试题
在校生党员自我评价
2013/09/25 职场文书
庐山导游词
2015/02/03 职场文书
你会写报告?产品体验报告到底该怎么写?
2019/08/14 职场文书
springboot 多数据源配置不生效遇到的坑及解决
2021/11/17 Java/Android
CSS3实现指纹特效代码
2022/03/17 HTML / CSS