Как организовать наследование свойств объектом другого объекта с возможностью одновременного изменения значения у обоих (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
288 +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 Апр 2024 в 13:06
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир