Как организовать наследование свойств объектом другого объекта с возможностью одновременного изменения значения у обоих (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 или иным способом, который считается общепринятым. То есть нужно, чтоб у объектов был общий интерфейс, но каждый имел свою реализацию.
Для реализации наследования свойств объектом другого объекта в 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. При необходимости можно создавать новые типы объектов, расширяя функционал и сохраняя общий интерфейс для всех объектов.
Для реализации наследования свойств объектом другого объекта в 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. При необходимости можно создавать новые типы объектов, расширяя функционал и сохраняя общий интерфейс для всех объектов.