function Polygon() {
Polygon.prototype.getArea = function () {
return 0;
}
}
function Triangle() {
Triangle.prototype = new Polygon();
}
var triangle = new Triangle();
alert(triangle.getArea());
var triangle1 = new Triangle();
alert(triangle1.getArea());
这段代码打不出东西来,如果我把alert(triangle.getArea());去掉, alert(triangle1.getArea());就可以打出来
这是为什么啊 ,也就是要在第2次实例化Triangle时才能打出来"OK".
或者代码改成如下:
function Polygon() {
Polygon.prototype.getArea = function () {
return "OK";
}
}
function Triangle() {
}
Triangle.prototype = new Polygon();
var triangle = new Triangle();
alert(triangle.getArea());
var triangle1 = new Triangle();
alert(triangle1.getArea());
这样就正常了,Triangle.prototype = new Polygon();这行代码写在函数里面和外面有什么区别呢
请问下这是为什么
[b]问题补充:[/b]
哈哈 我就是看了这本书 就是对书上的这个解释不明白才用的
但从技术上说,在代码运行前,对象已被实例化,并与原始的prototype对象联系在一起了,虽然用极晚绑定可使对原型对象的修改正确的反映出来,但替换prototype对象却不会对该对象产生任何的影响,只有对未来的对象实例才会反映出这种改变
这个我不知道怎么理解
未调用new Triangle()时,由于Triangle()中的构造函数还没有执行,所以Triganle对象的prototype并未改变。这时使用new Triangle()创建的对象,是原始的Triangle对象。
而调用过一次new Triangle()后,Traingle.prototype=new Polygon()被执行。Triangle的prototype被改变了。所以再次new Triangle()创建的就是改变之后的Triangle对象。
对此,楼主可以参照下面这个例子测试一下。
[code="js"]var i=0;//标识是第几次生成的Traingle对象。
function Polygon() {
Polygon.prototype.getArea = function (){
return "Polygon getArea()";
}
}
function OtherPolygon() {
OtherPolygon.prototype.getArea = function (){
return "OtherPolygon getArea()";
}
}
function Triangle() {
if(i==0){
Triangle.prototype = new Polygon();
}else if(i==1){
Triangle.prototype = new OtherPolygon();
}
i++;
}
Triangle.prototype.getArea = function(){
return "Triangle getArea()";
}
var triangle1 = new Triangle();
//第一次生成时,使用的是原始的prototype,结果为"Traingle getArea()",
//并执行了Triangle.prototype = new Polygon();语句。
alert(triangle1.getArea());
var triangle = new Triangle();
//第二次生成时,使用的是修改后的prototype(new Polygon()),结果为"Polygon getArea()",
//并执行了Triangle.prototype = new OtherPolygon();语句。
alert(triangle.getArea());
var triangle = new Triangle();
//第三次生成时,使用的是修改后的prototype(new OtherPolygon()),结果为"OtherPolygon getArea()",
alert(triangle.getArea());[/code]
LZ你把Triangle.prototype = new Polygon()这行代码写在构造函数里面
从逻辑上讲,这个位置是正确的,
但从技术上说,在代码运行前,对象已被实例化,并与原始的prototype对象联系在一起了,虽然用极晚绑定可使对原型对象的修改正确的反映出来,但替换prototype对象却不会对该对象产生任何的影响,只有对未来的对象实例才会反映出这种改变,这个是你第一个实例没有打印出来,而第二个实例打印出来的原因。
因此按你这种方式继承的话,必须在构造函数外赋予新的prototype对象。
LZ可以看看 《javascript高级程序设计》第4章,里面对js的继承做了详细的介绍。
希望能对lz有所帮助
直接修改prototype,不会影响他的实例,修改constructor的prototype的field才会改变实例