- function Circle(radius) { //定义父类Circle
- this.radius = radius;
- }
- Circle.prototype.area = function() { //定义父类的方法area计算面积
- return this.radius * this.radius * 3.14;
- }
- function PositionCircle(x,y,radius) { //定义类PositionCircle
- this.x = x; //属性横坐标
- this.y = y; //属性纵坐标
- Circle.call(this,radius); //调用父类的方法,相当于调用this.Circle(radius),设置PositionCircle类的
- //radius属性
- }
- PositionCircle.prototype = new Circle(); //设置PositionCircle的父类为Circle类
- var pc = new PositionCircle(1,2,1);
- alert(pc.area()); //3.14
- //PositionCircle类的area方法继承自Circle类,而Circle类的
- //area方法又继承自它的prototype属性对应的prototype对象
- alert(pc.radius); //1 PositionCircle类的radius属性继承自Circle类
- /*
- 注意:在前面我们设置PositionCircle类的prototype属性指向了一个Circle对象,
- 因此pc的prototype属性继承了Circle对象的prototype属性,而Circle对象的constructor属
- 性(即Circle对象对应的prototype对象的constructor属性)是指向Circle的,所以此处弹出
- 的是Circ.
- */
- alert(pc.constructor); //Circle
- /*为此,我们在设计好了类的继承关系后,还要设置子类的constructor属性,否则它会指向父类
- 的constructor属性
- */
- PositionCircle.prototype.constructor = PositionCircle
- alert(pc.constructor); //PositionCircle
感1:将第11句提到方法体首位,可以防止Circle属性的覆盖
感2:PositionCircle.prototype =
new
Circle(); 可以修改为:
PositionCircle.prototype = Circle.prototype();但不知道这样做会有什么影响