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


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 相关文章推荐
本地对象Array的原型扩展实现代码
Dec 04 Javascript
javascript截取字符串小结
Apr 28 Javascript
快速学习JavaScript的6个思维技巧
Oct 13 Javascript
JavaScript中获取纯正的undefined的方法
Mar 06 Javascript
关于vuex的学习实践笔记
Apr 05 Javascript
移动端手指放大缩小插件与js源码
May 22 Javascript
深入理解React中何时使用箭头函数
Aug 23 Javascript
[js高手之路]HTML标签解释成DOM节点的实现方法
Aug 31 Javascript
jquery实现回车键触发事件(实例讲解)
Nov 21 jQuery
vue translate peoject实现在线翻译功能【新手必看】
Jun 07 Javascript
JS实现数组删除指定元素功能示例
Jun 05 Javascript
uni-app 组件里面获取元素宽高的实现
Dec 27 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
利用php来自动调用不同服务器上的flash
2006/10/09 PHP
PHP导航下拉菜单的实现如此简单
2013/09/22 PHP
php+mysql实现简单的增删改查功能
2015/07/13 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解
2019/06/03 PHP
$()JS小技巧
2007/07/21 Javascript
用cssText批量修改样式
2009/08/29 Javascript
分享十五个最佳jQuery 幻灯插件和教程
2010/03/27 Javascript
Javascript下IE与Firefox下的差异兼容写法总结
2010/06/18 Javascript
iframe自适应宽度、高度 ie6 7 8,firefox 3.86下测试通过
2010/07/29 Javascript
网站页面自动跳转实现方法PHP、JSP(上)
2010/08/01 Javascript
ASP.NET jQuery 实例5 (显示CheckBoxList成员选中的内容)
2012/01/13 Javascript
用jQuery获取table中行id和td值的实现代码
2016/05/19 Javascript
Vue.js Ajax动态参数与列表显示实现方法
2016/10/20 Javascript
nodejs+mongodb aggregate级联查询操作示例
2018/03/17 NodeJs
vue中子组件调用兄弟组件方法
2018/07/06 Javascript
js拖动滑块和点击水波纹效果实例代码
2018/10/16 Javascript
es6 for循环中let和var区别详解
2020/01/12 Javascript
ES6函数和数组用法实例分析
2020/05/23 Javascript
js获取图片的base64编码并压缩
2020/12/05 Javascript
PyQt5每天必学之布局管理
2018/04/19 Python
Numpy中的mask的使用
2018/07/21 Python
Python 操作 ElasticSearch的完整代码
2019/08/04 Python
详解django使用include无法跳转的解决方法
2020/03/19 Python
python使用多线程查询数据库的实现示例
2020/08/17 Python
基于python实现简单网页服务器代码实例
2020/09/14 Python
Python模拟键盘输入自动登录TGP
2020/11/27 Python
python音频处理的示例详解
2020/12/23 Python
Html5元素及基本语法详解
2016/08/02 HTML / CSS
大学生职业生涯规划书范文
2014/01/04 职场文书
银行求职信怎么写
2014/05/26 职场文书
金融专业求职信
2014/08/05 职场文书
新店开张宣传语
2015/07/13 职场文书
大学迎新生的欢迎词
2019/06/25 职场文书
面试被问select......for update会锁表还是锁行
2021/11/11 MySQL
解决Windows Server2012 R2 无法安装 .NET Framework 3.5
2022/04/29 Servers