Как организовать наследование свойств объектом другого объекта с возможностью одновременного изменения значения у обоих (JavaScript)? Столкнулся с задачей. Нужно создать ряд объектов, у которых есть общее поведение, в моем случае это метод get, но также у каждого есть куча других свойств, на основе которых и должен работать этот метод. Вот мой код, который получился для решения задачи:(function(obj) {
function Request(action, params) {
var that = this;
for (var key in params) {
if (params.hasOwnProperty(key))
that[key] = params[key];
}
function updateParams() {
for (var key in params) {
if (params.hasOwnProperty(key) && that.hasOwnProperty(key))
params[key] = that[key];
}
}
this.get = function(callback) {
updateParams();
action(params, callback);
};
}
obj.RequestSomething = function() {
return new Request(controller.selectSomethings, {
key: "",
key1: "",
key2: "defaultValue"
});
};
obj.RequestCircle = function() {
return new Request(controller.selectCircles, {
radius: 0,
x: 0,
y: 0
});
};
})(testObj || testObj = {});
var rq = testObj.RequestSomethings();
rq.key1 = "test";
rq.get(function() { console.log(arguments); });
Мой вопрос состоит в том, как правильно это реализовать, используя prototype или иным способом, который считается общепринятым. То есть нужно, чтоб у объектов был общий интерфейс, но каждый имел свою реализацию.

21 Авг 2019 в 07:09
243 +1
0
Ответы
1

Для реализации наследования свойств объектом другого объекта в JavaScript с возможностью одновременного изменения значений у обоих объектов можно воспользоваться прототипами. В вашем случае можно создать прототип Request для всех объектов, у которых есть метод get, и затем создать конструкторы для каждого типа объектов (например, RequestSomething и RequestCircle), которые будут наследовать свойства и методы от прототипа Request.

Пример реализации с использованием прототипов:

function Request(action, params) {
this.action = action;
this.params = params;
}
Request.prototype.updateParams = function() {
for (var key in this.params) {
if (this.params.hasOwnProperty(key) && this.hasOwnProperty(key))
this.params[key] = this[key];
}
};
Request.prototype.get = function(callback) {
this.updateParams();
this.action(this.params, callback);
};
function RequestSomething(key, key1, key2) {
Request.call(this, controller.selectSomethings, { key: key, key1: key1, key2: key2 || "defaultValue" });
}
RequestSomething.prototype = Object.create(Request.prototype);
RequestSomething.prototype.constructor = RequestSomething;
function RequestCircle(radius, x, y) {
Request.call(this, controller.selectCircles, { radius: radius, x: x, y: y });
}
RequestCircle.prototype = Object.create(Request.prototype);
RequestCircle.prototype.constructor = RequestCircle;
var rq = new RequestSomething("", "test");
rq.key2 = "new value";
rq.get(function() { console.log(arguments); });
var rq2 = new RequestCircle(5, 10, 15);
rq2.get(function() { console.log(arguments); });

В данном примере создаются конструкторы RequestSomething и RequestCircle, каждый из которых наследует свойства и методы от прототипа Request. При необходимости можно создавать новые типы объектов, расширяя функционал и сохраняя общий интерфейс для всех объектов.

20 Апр в 13:06
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 541 автору
Первые отклики появятся уже в течение 10 минут
Прямой эфир