码迷,mamicode.com
首页 > 编程语言 > 详细

JavaScript面向对象编程(7)只继承prototype

时间:2014-12-11 19:10:14      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:javascript   面向对象编程   js   

上一讲我们学会了通过原型来继承父类实例的属性,即用prototype指向一个父类实例。

这样做我们需要人为地实例化一个父类对象,而且如果父类中有一些特别的属性和行为子类有可能是用不到。

由此我们自然会想,有没有一种办法只将一些公共属性和行为公开,让子类来继承呢?

做法很简单,就是将这些公共的属性和行为全部定义到父类的prototype中。

function Shape(){
	
}
Shape.prototype.name = 'shape';
Shape.prototype.toString = function() {return this.name;};

有一个2d形状的类,只需复用Shape的prototype(也是一个对象)的属性,就可以这样做

function TwoDShape(){
	
}
//先继承
TwoDShape.prototype = Shape.prototype;//与之前不同
TwoDShape.prototype.constructor = TwoDShape;
//重写
TwoDShape.prototype.name = '2D shape';

同理,三角形Triangle是一种典型的2d形状,它可以有自己的属性和行为,同时又需要继承TwoDShape的属性:

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);//坏了,重写变成了改写。。。

打印shape.name弹出的是Triangle

这是因为Triangle.prototype  TwoDShape.prototype  Shape.prototype指向的都是同一个对象,使用前最后一次修改决定了使用时的状态。

既然我们想到了用prototype来封装共性的供子类复用的属性和行为,那么我们可以坚持这种做法,但是目前这种写法带来的问题又该如何解决呢?请看下回分解!!

JavaScript面向对象编程(7)只继承prototype

标签:javascript   面向对象编程   js   

原文地址:http://blog.csdn.net/zhengwei223/article/details/41870109

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!