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


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全局变量封装模块实现代码
Nov 28 Javascript
JavaScript调用堆栈及setTimeout使用方法深入剖析
Feb 16 Javascript
深入理解JavaScript系列(31):设计模式之代理模式详解
Mar 03 Javascript
jQuery插件ajaxFileUpload实现异步上传文件效果
Apr 14 Javascript
javascript中字体浮动效果的简单实例演示
Nov 18 Javascript
JavaScript实现阿拉伯数字和中文数字互相转换
Jun 12 Javascript
HTML5 实现的一个俄罗斯方块实例代码
Sep 19 Javascript
Vue学习笔记进阶篇之vue-cli安装及介绍
Jul 18 Javascript
javascript观察者模式实现自动刷新效果
Sep 05 Javascript
详解vue-cli+element-ui树形表格(多级表格折腾小计)
Apr 17 Javascript
vue中npm包全局安装和局部安装过程
Sep 03 Javascript
js实现电灯开关效果
Jan 19 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
东方红 - 来复式再生机的修复
2021/03/02 无线电
用PHP实现多级树型菜单
2006/10/09 PHP
关于使用coreseek并为其做分页的介绍
2013/06/21 PHP
zend框架实现支持sql server的操作方法
2016/12/08 PHP
php命名空间设计思想、用法与缺点分析
2019/07/17 PHP
JavaScript 比较时间大小的代码
2010/04/24 Javascript
jQuery学习笔记之jQuery选择器的使用
2010/12/22 Javascript
Javascript 构造函数详解
2014/10/22 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖放商品放置购物车
2015/11/30 Javascript
jQuery Masonry瀑布流插件使用方法详解
2017/01/18 Javascript
bootstrap组件之导航组件使用方法
2017/01/19 Javascript
javascript数据类型详解
2017/02/07 Javascript
微信小程序实战之自定义模态弹窗(8)
2017/04/18 Javascript
Bootstrap提示框效果的实例代码
2017/07/12 Javascript
RequireJS用法简单示例
2018/08/20 Javascript
分享vue里swiper的一些坑
2018/08/30 Javascript
angular的输入和输出的使用方法
2018/09/22 Javascript
JSON基本语法及与JavaScript的异同实例分析
2019/01/04 Javascript
JS中实现一个下载进度条及播放进度条的代码
2019/06/10 Javascript
jQuery实现手风琴效果(蒙版)
2020/01/11 jQuery
vue中父子组件传值,解决钩子函数mounted只运行一次的操作
2020/07/27 Javascript
解决python写入mysql中datetime类型遇到的问题
2018/06/21 Python
详解基于python的多张不同宽高图片拼接成大图
2019/09/26 Python
pytorch实现用CNN和LSTM对文本进行分类方式
2020/01/08 Python
在 Linux/Mac 下为Python函数添加超时时间的方法
2020/02/20 Python
Python json读写方式和字典相互转化
2020/04/18 Python
基于django和dropzone.js实现上传文件
2020/11/24 Python
Python 实现一个简单的web服务器
2021/01/03 Python
CSS3截取字符串实例代码【推荐】
2018/06/07 HTML / CSS
html5中如何将图片的绝对路径转换成文件对象
2018/01/11 HTML / CSS
英国婴儿产品专家:Samuel Johnston
2020/04/20 全球购物
党的群众路线教育实践活动心得体会(企业)
2014/11/03 职场文书
学习普通话的体会
2014/11/07 职场文书
小英雄雨来观后感
2015/06/09 职场文书
合理化建议书范文
2015/09/14 职场文书
MySQL 条件查询的常用操作
2022/04/28 MySQL