标签:javascript 面向对象编程 js
上一讲我们学会了通过原型来继承父类实例的属性,即用prototype指向一个父类实例。
这样做我们需要人为地实例化一个父类对象,而且如果父类中有一些特别的属性和行为子类有可能是用不到。
由此我们自然会想,有没有一种办法只将一些公共属性和行为公开,让子类来继承呢?
做法很简单,就是将这些公共的属性和行为全部定义到父类的prototype中。
function Shape(){
}
Shape.prototype.name = 'shape';
Shape.prototype.toString = function() {return this.name;};
function TwoDShape(){
}
//先继承
TwoDShape.prototype = Shape.prototype;//与之前不同
TwoDShape.prototype.constructor = TwoDShape;
//重写
TwoDShape.prototype.name = '2D shape';function Triangle(side, height) {
this.side = side;
this.height = height;
this.getArea = function(){return this.side * this.height / 2;};
}
Triangle.prototype = TwoDShape.prototype;
Triangle.prototype.constructor = Triangle;
//重写
Triangle.prototype.name="Triangle";var my = new Triangle(5, 10); /**/ alert(my.getArea()); alert(my.toString());//自己没有toString方法,继承而来 alert(my.constructor); alert(my instanceof TwoDShape);//有继承的特性 alert(my instanceof Shape);
var shape = new Shape(); alert(shape.name);//坏了,重写变成了改写。。。
这是因为Triangle.prototype TwoDShape.prototype Shape.prototype指向的都是同一个对象,使用前最后一次修改决定了使用时的状态。
既然我们想到了用prototype来封装共性的供子类复用的属性和行为,那么我们可以坚持这种做法,但是目前这种写法带来的问题又该如何解决呢?请看下回分解!!
JavaScript面向对象编程(7)只继承prototype
标签:javascript 面向对象编程 js
原文地址:http://blog.csdn.net/zhengwei223/article/details/41870109