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性能优化技巧分析
Feb 20 Javascript
javascript实现3D切换焦点图
Oct 16 Javascript
基于jQuery和CSS3制作响应式水平时间轴附源码下载
Dec 20 Javascript
jQuery实现放大镜效果实例代码
Mar 17 Javascript
jQuery+CSS实现简单切换菜单示例
Jul 27 Javascript
jQuery使用$获取对象后检查该对象是否存在的实现方法
Sep 04 Javascript
jQuery内容筛选选择器实例代码
Feb 06 Javascript
AngularJS实现的回到顶部指令功能实例
May 17 Javascript
Angularjs 手写日历的实现代码(不用插件)
Oct 18 Javascript
JavaScript解析机制与闭包原理实例详解
Mar 08 Javascript
解决layer弹出层中表单不起作用的问题
Sep 09 Javascript
vue封装可复用组件confirm,并绑定在vue原型上的示例
Oct 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
php下删除字符串中HTML标签的函数
2008/08/27 PHP
根据ip调用新浪api获取城市名并转成拼音
2014/03/07 PHP
PHP引用返回用法示例
2016/05/28 PHP
PHP实现一个简单url路由功能实例
2016/11/05 PHP
利用PHP判断是手机移动端还是PC端访问的函数示例
2017/12/14 PHP
php引用和拷贝的区别知识点总结
2019/09/23 PHP
jQuery 获取对象 定位子对象
2010/05/31 Javascript
document.documentElement的一些使用技巧
2013/04/18 Javascript
jquery实现html页面 div 假分页有原理有代码
2014/09/06 Javascript
JavaScript中实现单体模式分享
2015/01/29 Javascript
jQuery获取样式中颜色值的方法
2015/01/29 Javascript
bootstrap组件之按钮式下拉菜单小结
2017/01/19 Javascript
从零学习node.js之简易的网络爬虫(四)
2017/02/22 Javascript
vue下拉列表功能实例代码
2018/04/08 Javascript
对VUE中的对象添加属性
2018/09/18 Javascript
Jquery Datatables的使用详解
2020/01/30 jQuery
JavaScript oncopy事件用法实例解析
2020/05/13 Javascript
解决vue项目运行提示Warnings while compiling.警告的问题
2020/09/18 Javascript
实例探究Python以并发方式编写高性能端口扫描器的方法
2016/06/14 Python
python实现Floyd算法
2018/01/03 Python
python模块之paramiko实例代码
2018/01/31 Python
30秒轻松实现TensorFlow物体检测
2018/03/14 Python
nginx黑名单和django限速,最简单的防恶意请求方法分享
2019/08/09 Python
python常用运维脚本实例小结
2020/02/14 Python
Python作用域与名字空间原理详解
2020/03/21 Python
解决pycharm导入numpy包的和使用时报错:RuntimeError: The current Numpy installation (‘D:\\python3.6\\lib\\site-packa的问题
2020/12/08 Python
美国排名第一的在线葡萄酒商店:Wine.com
2016/09/07 全球购物
日本面向世界,国际级的免税在线购物商城:DOKODEMO
2017/02/01 全球购物
广州某公司软件工程师面试题
2014/12/22 面试题
PHP引擎php.ini参数优化深入讲解
2021/03/24 PHP
外语学院毕业生的自我鉴定
2013/11/28 职场文书
办公室主任职责范本
2014/03/07 职场文书
有创意的广告词
2014/03/18 职场文书
北京导游词
2015/02/12 职场文书
结婚通知短信怎么写
2015/04/17 职场文书
高中优秀作文(范文)
2019/08/15 职场文书