对采用动态原型方式无法展示继承机制得思考


Posted in Javascript onDecember 04, 2009
<script type="text/javascript"> 
function Polygon(iSides) { 
this.sides = iSides; 
if(typeof Polygon._initialized == "undefined") { 
Polygon.prototype.getArea = function() { 
return 0; 
}; 
Polygon._initialized = true; 
} 
} 
function Triangle(iBase,iHeight) { 
Polygon.call(this,3); 
this.base = iBase; 
this.hei = iHeight; 
if(typeof Triangle._initialized == "undefined") { 
Triangle.prototype = new Polygon(); 
Triangle.prototype.getArea = function() { 
return this.base * this.hei * 0.5; 
}; 
Triangle._initialized = true; 
} 
} 
var oTriangle1 = new Triangle(12,4); 
alert(oTriangle1.sides); 
//alert(oTriangle1.getArea()); 
//这句代码是无法运行的。FireBug显示oTriangle1.getArea()不是一个function 
</script>

刚开始琢磨这段代码是很奇怪,为什么不能运行呢?于是我就开始结合作者的叙述思考(作者在这段代码后面的解释很绕,不多看几遍是理解不了他在说什么的),最后终于被我想通了。

我们已经知道,用var anObject = new aFunction()形式创建对象的过程实际上可以分为3步:

(1)建立新对象

(2)将该对象内置的prototype对象设置为构造函数portotype引用的那个原型对象

(3)将该对象作为this参数调用构造函数,完成成员设置等初始化工作

请大家注意第(2)步,原来,

var oTriangle1 = new Triangle(12,4);

这句执行时,内部执行oTriangle1.prototype = Triangle.prototype;(当然,此时Triangle.prototype对象本身也没什么实际属性和方法) 然后才继续执行直到第(3)步,运行函数体,第一次运行到

Triangle.prototype = new Polygon();

但这句执行完后,oTriangle1.prototype却已经无法再赋值了(即执行不到oTriangle1.prototype = Triangle.prototype;),接下来程序执行

Triangle.prototype.getArea = function() { 
return this.base * this.hei * 0.5; 
};

但此时却是为时已晚,oTriangle1.prototype对象是不会拥有该方法的,拥有该方法的只能是刚才new Polygon()创建的对象,于是就有了程序最后一行注释的结果了。但是接下来创建的Triangle对象却能正常运行了。请看下面代码:

代码

<script type="text/javascript"> 
function Polygon(iSides) { 
this.sides = iSides; 
if(typeof Polygon._initialized == "undefined") { 
Polygon.prototype.getArea = function() { 
return 0; 
}; 
Polygon._initialized = true; 
} 
} 
function Triangle(iBase,iHeight) { 
Polygon.call(this,3); 
this.base = iBase; 
this.hei = iHeight; 
if(typeof Triangle._initialized == "undefined") { 
Triangle.prototype = new Polygon(); 
Triangle.prototype.getArea = function() { 
return this.base * this.hei * 0.5; 
}; 
Triangle._initialized = true; 
} 
} 
var oTriangle1 = new Triangle(12,4); 
alert(oTriangle1.sides); 
//alert(oTriangle1.getArea()); 
//这句代码是无法运行的。FireBug显示oTriangle1.getArea()不是一个function 
var oTriangle2 = new Triangle(10,5); 
alert(oTriangle2.sides); 
//程序最终运行证明了我的理解是正确的。 
alert(oTriangle2.getArea()); 
</script>

至于原因嘛,也就是我前面分析的,此时内部执行oTriangle2.prototype=Triangle.prototype;该原型对象被赋予了有实际属性和方法的对象引用。

Javascript 相关文章推荐
JavaScript 学习笔记 Black.Caffeine 09.11.28
Nov 30 Javascript
固定网页背景图同时保持图片比例的思路代码
Aug 15 Javascript
jquery实现ajax提交form表单的方法总结
Mar 03 Javascript
JS实现文件动态顺序载入的方法
Mar 07 Javascript
Js实现自定义右键行为
Mar 26 Javascript
Bootstrap每天必学之标签与徽章
Nov 27 Javascript
利用vue + element实现表格分页和前端搜索的方法
Dec 25 Javascript
React-native桥接Android原生开发详解
Jan 17 Javascript
微信小程序日期选择器实例代码
Jul 18 Javascript
vuejs 制作背景淡入淡出切换动画的实例
Sep 01 Javascript
使用VueRouter的addRoutes方法实现动态添加用户的权限路由
Jun 03 Javascript
JavaScript直接调用函数与call调用的区别实例分析
May 22 Javascript
JavaScript 申明函数的三种方法 每个函数就是一个对象(一)
Dec 04 #Javascript
javascript 跳转代码集合
Dec 03 #Javascript
javascript KeyDown、KeyPress和KeyUp事件的区别与联系
Dec 03 #Javascript
javascript json 新手入门文档
Dec 03 #Javascript
js 屏蔽鼠标右键脚本附破解方法
Dec 03 #Javascript
33种Javascript 表格排序控件收集
Dec 03 #Javascript
javascript 面向对象全新理练之原型继承
Dec 03 #Javascript
You might like
win7 64位系统 配置php最新版开发环境(php+Apache+mysql)
2014/08/15 PHP
PHP基于接口技术实现简单的多态应用完整实例
2017/04/26 PHP
使用JS实现jQuery的addClass, removeClass, hasClass函数功能
2014/10/31 Javascript
jQuery实现在最后一个元素之前插入新元素的方法
2015/07/18 Javascript
Javascript使用function创建类的两种方法(推荐)
2016/11/19 Javascript
纯javaScript、jQuery实现个性化图片轮播【推荐】
2017/01/08 Javascript
vue.js项目nginx部署教程
2018/04/05 Javascript
webpack4+react多页面架构的实现
2018/10/25 Javascript
JS 验证码功能的三种实现方式
2018/11/26 Javascript
layui-tree实现Ajax异步请求后动态添加节点的方法
2019/09/23 Javascript
vue 实现通过vuex 存储值 在不同界面使用
2019/11/11 Javascript
Javascript实现秒表计时游戏
2020/05/27 Javascript
[00:08]DOTA2勇士令状等级奖励“天外飞星”
2019/05/24 DOTA
[03:02]2020完美世界城市挑战赛(秋季赛)总决赛回顾
2021/03/11 DOTA
python基础教程之循环介绍
2014/08/29 Python
Python操作CouchDB数据库简单示例
2015/03/10 Python
在Python中封装GObject模块进行图形化程序编程的教程
2015/04/14 Python
Python中优化NumPy包使用性能的教程
2015/04/23 Python
Python函数的周期性执行实现方法
2016/08/13 Python
Python设计模式之中介模式简单示例
2018/01/09 Python
python写入已存在的excel数据实例
2018/05/03 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
2020/07/01 Python
PyTorch: Softmax多分类实战操作
2020/07/07 Python
HTML5梦幻之旅——炫丽的流星雨效果实现过程
2013/08/06 HTML / CSS
测试驱动开发的主要步骤是什么
2014/12/10 面试题
物流仓储计划书
2014/01/10 职场文书
大学生学习自我评价
2014/01/13 职场文书
送温暖献爱心活动总结
2014/07/08 职场文书
党的群众路线教育实践活动对照检查材料思想汇报(党员篇)
2014/09/25 职场文书
私人房屋买卖协议书
2014/10/04 职场文书
小学母亲节活动总结
2015/02/10 职场文书
大二学年个人总结
2015/03/03 职场文书
2015年劳动部工作总结
2015/05/23 职场文书
《搭石》教学反思
2016/02/18 职场文书
Redis做数据持久化的解决方案及底层原理
2021/07/15 Redis
Redis实战高并发之扣减库存项目
2022/04/14 Redis