日期:2014-05-16  浏览次数:20297 次

看书上讲js继承的问题关于prototype的,里面有我写的例子,但有3个地方不明白,得到答案就结帖
我对着书写的例子但是书上的讲解不明白.
"///语句A "放到现在这个位置就提示 "对象不支持此属性或方法 ".
(代码可以执行到alert( "2 ")   )这里
解决方法1:
下面的   "///语句A "这行的内容非要放到方法的外面,这代码执行才没有问题;
解决方法2:
"///语句A "这行如果不写注释掉,这代码也可以执行.

现在的问题是:
1.不明白这2种解决方法的不同点,
2.为什么这样写才可以,就是js语言的问题我可能还有地方不明白.
望大家帮我看看
---------------------------
<script>
function   Polygon(sides)   //多边形
{
this.sides   =   sides;
if(typeof   Polygon._initialized   ==   "undefined ")
{
Polygon.prototype.getArea   =   function(){
return   0;
};
Polygon._initialized   =   "true ";
}
}
function   Triangle(base,height)   ///三角形
{
Polygon.call(this,3);
this.base   =   base;
this.height=   height;
if(typeof   Triangle._initialized   ==   "undefined ")
{
Triangle.prototype   =   new   Polygon(); ////语句A                   Triangle.prototype.getArea   =   function(){
return   0.5*this.base*this.height;
};
Triangle._initialized   =   "true ";
}
alert( "1 ");
}
var   d     =   new   Triangle( "5 ", "2 ");
alert( "sides= "+d.sides)
alert(d.getArea())
alert( "2 ");
</script>
--------------------------

------解决方案--------------------
语法有问题,无法运行
------解决方案--------------------
是因为你已经用Polygon.call(this,3),调用了Polygon方法.它成了Triangle函数的一个变量,在这个函数内有效.所以去掉语句A没什么问题,再说你语句A写的有问题.
你把Polygon()附加给Triangle的什么? 你没有指明...

你应该把Polygon()附加到Triangle的一个属性.如Triangle.prototype.polygon=Polygon;
然后在生明Triangle后调用这个方法属性.

------解决方案--------------------
红卫 啊,俺看到差距了
俺看不懂,继续解说
------解决方案--------------------
上面都已经call出一个实例了,后面还new什么呀,只改一个地方就可以了
<script>
function Polygon(sides) //多边形
{
this.sides = sides;
if(typeof Polygon._initialized == "undefined ")
{
Polygon.prototype.getArea = function(){
return 0;
};
Polygon._initialized = "true ";
}
}
function Triangle(base,height) ///三角形
{
Polygon.call(this,3);
this.base = base;
this.height= height;
if(typeof Triangle._initialized == "undefined ")
{
Triangle.prototype.prototype = Polygon.prototype;
Triangle.prototype.getArea = function(){
return 0.5*this.base*this.height;
};
Triangle._initialized = "true ";
}
alert( "1 ");
}
var d = new Triangle( "5 ", "2 ");
alert( "sides= "+d.sides)
alert(d.getArea())
alert( "2 ");
</script>