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中$.fn的用法示例介绍
Nov 05 Javascript
javascript中的if语句使用介绍
Nov 20 Javascript
Web开发必知Javascript技巧大全
Feb 23 Javascript
值得分享的JavaScript实现图片轮播组件
Nov 21 Javascript
javascript常用的设计模式
Feb 09 Javascript
微信小程序 动态传参实例详解
Apr 27 Javascript
js原生实现移动端手指滑动轮播图效果的示例
Jan 02 Javascript
手写简单的jQuery雪花飘落效果实例
Apr 22 jQuery
微信小程序wx.uploadfile 本地文件转base64的实现代码
Jun 28 Javascript
详解jQuery如何实现模糊搜索
May 10 jQuery
微信小程序中网络请求缓存的解决方法
Dec 29 Javascript
利用js实现简易红绿灯
Oct 15 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
将RTF格式的文件转成HTML并在网页中显示的代码
2006/10/09 PHP
PHP新手上路(十二)
2006/10/09 PHP
PHP 删除文件与文件夹操作 unlink()与rmdir()这两个函数的使用
2011/07/17 PHP
PHP mysql与mysqli事务使用说明 分享
2013/08/17 PHP
PHP简单实现HTTP和HTTPS跨域共享session解决办法
2015/05/27 PHP
Javascript 错误处理的几种方法
2009/06/13 Javascript
javascript 无提示关闭窗口脚本
2009/08/17 Javascript
js 纯数字不重复排列的另类方法
2010/07/17 Javascript
JavaScript版DateAdd和DateDiff函数代码
2012/03/01 Javascript
文本有关的样式和jQuery求对象的高宽问题分别说明
2013/08/30 Javascript
jquery上传插件fineuploader上传文件使用方法(jquery图片上传插件)
2013/12/05 Javascript
jQuery构造函数init参数分析
2015/05/13 Javascript
nodejs实现获取当前url地址及url各种参数值
2015/06/25 NodeJs
js获取鼠标点击的对象,点击另一个按钮删除该对象的实现代码
2016/05/13 Javascript
jQuery代码性能优化的10种方法
2016/06/21 Javascript
Vue框架之goods组件开发详解
2018/01/25 Javascript
从零开始在vue-cli4配置自适应vw布局的实现
2020/06/08 Javascript
基于Ionic3实现选项卡切换并重新加载echarts
2020/09/24 Javascript
基于vuex实现购物车功能
2021/01/10 Vue.js
使用Python处理Excel表格的简单方法
2018/06/07 Python
Python 2/3下处理cjk编码的zip文件的方法
2019/04/26 Python
Python tkinter实现日期选择器
2021/02/22 Python
Janie and Jack美国官网:GAP旗下的高档童装品牌
2019/09/09 全球购物
波兰品牌鞋履在线商店:Eastend.pl
2020/01/11 全球购物
linux面试题参考答案(10)
2016/10/26 面试题
会计实习期自我鉴定
2013/10/06 职场文书
火锅店创业计划书范文
2014/02/02 职场文书
会计电算化专业自荐信
2014/03/15 职场文书
校园文明标语
2014/06/13 职场文书
客房部经理岗位职责
2015/02/02 职场文书
慈善募捐倡议书
2015/04/27 职场文书
故意伤害辩护词
2015/05/21 职场文书
2015年秋季运动会前导词
2015/07/20 职场文书
用Python提取PDF表格的方法
2021/04/11 Python
python解析照片拍摄时间进行图片整理
2022/07/23 Python
Mysql如何查看是否使用到索引
2022/12/24 MySQL