我们的想法是在继承的类Rectangle上从Shape实现calculateSurface方法,并使用在Rectangle类上传递的参数计算表面。
function Shape (w,h){
this.h = h;
this.w = w;
this.calculateSurface = function (){
return this.w*this.h;
};
}
function Rectangle (w,h){
Shape.apply(this, arguments);
this.w = w;
this.h = h;
this.calcSurface = function(){
return Shape.calculateSurface(this.w, this.h);
};
}
Rectangle.prototype = new Shape();
Rectangle.prototype.constructor = Rectangle;
var rec = new Rectangle(4,4);
console.log(rec.calcSurface());
我得到的错误是:
Uncaught TypeError: Object function Shape(w,h){
this.h = h;
this.w = w;
this.calculateSurface = function (){
return this.w*this.h;
};
} has no method 'calculateSurface'
答案 0 :(得分:2)
这一行...
return Shape.calculateSurface(this.w, this.h);
正在calculateSurface()
功能上寻找Shape()
方法。除非它不在那里,它在构造函数返回的对象上。
你想要这样的东西......
var self = this;
this.calcSurface = function(){
return self.calculateSurface(this.w, this.h);
};
另外,将calculateSurface()
放在Shape
的{{1}}属性上可能是值得的,这样如果你创建了很多prototype
个对象,你只能使用方法生效曾经在记忆中。
答案 1 :(得分:0)
请改用:
return (new Shape(this.w, this.h)).calculateSurface(this.w, this.h);
答案 2 :(得分:0)
更改
return Shape.calculateSurface(this.w, this.h);
到
return this.calculateSurface(this.w, this.h);
因为您将Rectangle
的原型指向Shape
Rectangle.prototype = new Shape();