@mmmq

Как объединить два класса в JS?

Привет.

Нужно объединить 2 класса, чтобы работали как единый компонент. Чтобы был доступ между собой к любым функциям и переменным через this.

Если делать через constructor() и super(), получается некрасивая штука с зависимостями, нет единого компонента, если взаимосвязанные.

По сути, хочу смержить 2 класа в один и с ним работать.
  • Вопрос задан
  • 1341 просмотр
Решения вопроса 2
fomenkogregory
@fomenkogregory
Юниор софтварный инженер
В js нет множественного наследования
Ответ написан
Комментировать
Robur
@Robur
Знаю больше чем это необходимо
Можно просто скопировать все свойства в одну кучу, это же просто объекты, но это будет наааааамного некрасивее чем constructor() и super()
В целом ваше желание звучит весьма подозрительно и скорее всего приведет к плохому коду. Используйте стандартные средства языка, привыкните
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
lazalu68
@lazalu68
Salmon
class FirstClass {
}

class SecondClass extends FirstClass {
}
Ответ написан
Комментировать
@AlexRsk
Можно сделать через примеси и шаблон "поведение".
// Реализует наследование
function inherit(proto) {
	function F() {}
	F.prototype = proto;
	var object = new F;
	return object;
}

//Реализует примеси
function mixin(dest, src) {
	var field, tempObj = {};
	for (field in src) {
		if (typeof(tempObj[field]) == undefined || (tempObj[field] != src[field])) {
			dest[field] = src[field];
		}
	}
}

/* Behaviors  */

//Поведение позволяет осуществить примешивание к целевому классу новых методов и свойств.

// приватные свойства
behavior = function(targetObj, name) {
	this.name = name;
	this.owner = targetObj;
};

behavior.prototype = {
"mixin": function(dest, src) {
		var field, systemNames = ['setOwner', 'getOwner', 'apply'],
			tempObj = {};
		for (field in src) {
			if (
			(typeof(tempObj[field]) == undefined || (tempObj[field] != src[field])) 
&& systemNames.indexOf(src[field]) === -1) {
				dest[field] = src[field];
			}
		}
	},

	"setOwner": function(owner) {
		this.Class = this.constructor.name;
		this.owner = owner;
		if (this.apply) {
			this.apply();
		}
		mixin(this.owner, this);

	},
	"getOwner": function() {
		return owner;
	},
	"apply": function() {

		this.mixin(this.owner, this);
	}

};

applyToBehavior = function() {};
applyToBehavior.prototype = inherit(behavior.prototype);
applyToBehavior.prototype.applyTo = function(targetObj, methodName, param) {
	if (targetObj && this[methodName]) {
		this[methodName].call(targetObj, param);
	}
};
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы