2

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

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

Таким образом, применяя это, я надеясь создать два объекта, один из которых наследует методы от другого. Один - для размеров видовых экранов, а один - для размеров устройства. Но оба используют аналогичные математические сравнения, поэтому я считаю, что имеет смысл наследовать другого. (. More info about the actual methods is here)

var Viewport = { 
    inORout: function (curr, min, max) { 
     // [email protected] 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.width() и т.д. ошибки уходят, но потом я думаю, что наследование не работает. Ошибки возникают, когда я использую методы из любого объекта. Что мне не хватает? Есть ли лучший образец для этого? Как я могу сделать эту работу?

+0

[работает для меня] (HTTP: // jsfiddle. net/VNAQa/5 /) – Raynos

+0

@Raynos @ André Alçada Padez Я понял это. Проблема заключалась в том, что я использовал методы таким образом, чтобы изменить контекст 'this'. Методы не были определены на *, что * 'this'. – ryanve

ответ

1

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

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

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

+0

Разве это не классическое наследование? Я все равно пробовал, и он дает ошибку 'Can not set property 'inORout' undefined'. Метод 'clone()' должен обрабатывать это. Я считаю, что это эквивалентно 'Object.create' https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/create, добавленному в JavaScript 1.8.5 – ryanve

+0

функция F() {} -> не вы отсутствует знак = (знак равенства)? –

+0

Внутри функции 'функция F() {}' эквивалентна 'var F = function() {};' – ryanve