Я использую этот метод клонирования для прототипного наследования от 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()
и т.д. ошибки уходят, но потом я думаю, что наследование не работает. Ошибки возникают, когда я использую методы из любого объекта. Что мне не хватает? Есть ли лучший образец для этого? Как я могу сделать эту работу?
[работает для меня] (HTTP: // jsfiddle. net/VNAQa/5 /) – Raynos
@Raynos @ André Alçada Padez Я понял это. Проблема заключалась в том, что я использовал методы таким образом, чтобы изменить контекст 'this'. Методы не были определены на *, что * 'this'. – ryanve