Методы переопределения с прототипным наследованием - PullRequest
2 голосов
/ 26 января 2012

Я использую этот метод клонирования для наследования прототипов из Pro JavaScript Design Patterns , который в основном совпадает с функцией Крокфорда object () .(Единственное отличие состоит в том, что Крокфорд добавляет паренк для вызова, но так как F пусто, я не уверен, что это важно. Я не думаю, что проблема.)

clone = function(object) {
    function F() {}
    F.prototype = object;
    return new F;
};

Итак, применяя это, яищу сделать два объекта, один из которых наследует методы от другого.Один предназначен для размеров области просмотра, а другой - для размеров устройства.Но оба используют одинаковые математические сравнения, поэтому я думаю, что имеет смысл, чтобы одно наследовало другое.( Больше информации о реальных методах здесь .)

var Viewport = {
    inORout: function (curr, min, max) {
        // !@return boolean true if curr equals min or max, or is in between.
        min = min || 0; // Default min.
        return !max ? ( curr >= min ) : ( curr >= min && curr <= max );
    }
  , width: function() {
        return document.documentElement.clientWidth; 
    }
  , height: function() { 
        return document.documentElement.clientHeight; 
    }
  , inWidthRange: function (min, max) {
        return this.inORout(this.width(), min, max);
    }
  , inHeightRange: function (min, max) {
        return this.inORout(this.height(), min, max);
    }
};

// I want to use prototypal inheritance to make Device inherit the
// inORout/inWidthRange/inHeightRange methods from Viewport but 
// override the width() and height() methods:
var Device = clone(Viewport);
Device.width = function() {
    return window.screen.width; 
};
Device.height = function() {
    return window.screen.height; 
};

Но проблема в том, что я получаю такие ошибки:

 Object # <Object> has no method 'inORout'
 and 
 Object # <Object> has no method 'width'
 and 
 Object # <Object> has no method 'height'

Если я изменю ссылкудо this.width() и т. д. в Viewport до Viewport.width() и т. д. ошибки исчезают, но тогда я думаю, что наследование не работает.Ошибки происходят, когда я использую методы из любого объекта.Что мне не хватает?Есть ли лучший шаблон для этого?Как я могу сделать эту работу?

1 Ответ

1 голос
/ 26 января 2012

с прототипом вы должны делать вещи немного иначе:

var Viewport = {};
Viewport.prototype.inOrOut = function(){...};
Viewport.prototype.width= function(){...};
Viewport.prototype.height = function(){...};

таким образом, вы сможете правильно наследовать ...

...