未捕获的TypeError:对象函数没有方法

时间:2012-10-29 11:51:58

标签: javascript

我们的想法是在继承的类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' 

3 个答案:

答案 0 :(得分:2)

这一行...

return Shape.calculateSurface(this.w, this.h);

正在calculateSurface()功能上寻找Shape()方法。除非它不在那里,它在构造函数返回的对象上。

你想要这样的东西......

var self = this;
this.calcSurface = function(){
    return self.calculateSurface(this.w, this.h);
};

jsFiddle

另外,将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();