对采用动态原型方式无法展示继承机制得思考
对采用动态原型方式无法展示继承机制得思考
发布时间:2016-12-30 来源:查字典编辑
摘要:复制代码代码如下:functionPolygon(iSides){this.sides=iSides;if(typeofPolygon._i...

复制代码 代码如下:

<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教程学习
编程开发子分类