Честно говоря, я не знаю точной причины, но вам нужно установить прототип вне функции конструктора:
function SpecificRectangle(w, h, angle) {
Rectangle.call(this,w,h);
}
SpecificRectangle.prototype = new Rectangle();
SpecificRectangle.prototype.constructor = SpecificRectangle; // Otherwise instances of SpecificRectangle would have a constructor of Rectangle
Рабочий пример здесь .
Редактировать после комментария @herby:
Похоже, что верхний метод может нарушить наследование прототипа в зависимости от того, как построен конструктор суперкласса (см. thisarticle ).
Более надежное решение - использовать Object.create
( source - спасибо herby)
// in case Object.create does not exist
if (typeof Object.create !== 'function') {
Object.create = function(o) {
var F = function() {};
F.prototype = o;
return new F();
};
}
function Rectangle(w, h) {
this.width = w;
this.height = h;
}
Rectangle.prototype.area = function() {
return this.width * this.height
}
function SpecificRectangle(w, h, angle) {
Rectangle.call(this, w, h);
}
SpecificRectangle.prototype = Object.create(Rectangle.prototype);
SpecificRectangle.prototype.constructor = SpecificRectangle;
var r = new SpecificRectangle(100, 50, 30);
alert(r.area());
Обновлен пример jsfiddle