作家
登录

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

作者: 来源:www.28hudong.com 2013-03-30 02:05:13 阅读 我要评论

复制代码 代码如下: <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;该原型对象被赋予了有实际属性和方法的对象引用。

  推荐阅读

  IE7中javascript操作CheckBox的checked=true不打勾的解决方法

复制代码 代码如下: var chkbox = document.createElement("INPUT"); chkbox.type = "checkbox"; chkbox.checked=true; lnk.parentNode.appendChild(chkbox); 以上代码在IE7下,生成的Checkbox无法正确的打上勾。>>>详细阅读


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

地址:http://www.17bianji.com/kaifa2/JS/27557.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)