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 ajax例子返回值详解
Sep 11 Javascript
对之前写的jquery分页做下升级
Jun 19 Javascript
javascript实现根据时间段显示问候语的方法
Jun 18 Javascript
javascript截图 jQuery插件imgAreaSelect使用详解
May 04 Javascript
Angular.Js之Scope作用域的学习教程
Apr 27 Javascript
jQuery事件对象的属性和方法详解
Sep 09 jQuery
angular实现input输入监听的示例
Aug 31 Javascript
Node批量爬取头条视频并保存方法
Sep 20 Javascript
微信小程序实现的自定义分享功能示例
Feb 12 Javascript
详解使用Nuxt.js快速搭建服务端渲染(SSR)应用
Mar 13 Javascript
JS数组中对象去重操作示例
Jun 04 Javascript
vue treeselect获取当前选中项的label实例
Aug 31 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
MySQL GBK→UTF-8编码转换
2007/05/24 PHP
PHP程序员常见的40个陋习,你中了几个?
2014/11/20 PHP
基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
2017/01/24 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
2018/02/19 PHP
PHP pthreads v3下同步处理synchronized用法示例
2020/02/21 PHP
JS中的prototype与面向对象的实例讲解
2013/05/22 Javascript
javascript如何判断输入的url是否正确
2014/04/11 Javascript
ajaxFileUpload.js插件支持多文件上传的方法
2014/09/02 Javascript
js图片轮播手动切换效果
2015/11/10 Javascript
JavaScript正则表达式的分组匹配详解
2016/02/13 Javascript
浅析Javascript ES6中的原生Promise
2016/08/25 Javascript
详解RequireJs官方使用教程
2017/10/31 Javascript
EasyUI的DataGrid绑定Json数据源的示例代码
2017/12/16 Javascript
Vue中v-show添加表达式的问题(判断是否显示)
2018/03/26 Javascript
node实现的爬虫功能示例
2018/05/04 Javascript
Webpack设置环境变量的一些误区详解
2019/12/19 Javascript
从零使用TypeScript开发项目打包发布到npm
2020/02/14 Javascript
微信小程序点击生成朋友圈分享图(遇到的坑)
2020/06/17 Javascript
原生JS实现相邻月份日历
2020/10/13 Javascript
JavaScript实现网页下拉菜单效果
2020/11/20 Javascript
用Python代码来绘制彭罗斯点阵的教程
2015/04/03 Python
Python中__init__.py文件的作用详解
2016/09/18 Python
Python打印“菱形”星号代码方法
2018/02/05 Python
python 函数的缺省参数使用注意事项分析
2019/09/17 Python
python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例
2020/02/26 Python
Python flask框架实现浏览器点击自定义跳转页面
2020/06/04 Python
HTML5之HTML元素扩展(下)—增强的Form表单元素值得关注
2013/01/31 HTML / CSS
凯蒂·佩里个人女鞋品牌:Katy Perry Collections
2019/04/04 全球购物
老公给老婆的道歉信
2014/01/10 职场文书
2014年巴西世界杯口号
2014/06/05 职场文书
毕业生求职信
2014/06/10 职场文书
安全目标责任书
2014/07/22 职场文书
个人整改方案范文
2014/10/25 职场文书
高校教师个人工作总结2014
2014/12/17 职场文书
Vue3如何理解ref toRef和toRefs的区别
2022/02/18 Vue.js
Python使用plt.boxplot()函数绘制箱图、常用方法以及含义详解
2022/08/14 Python