@constantant

Как написать функцию getBloobyConstructor?

Ребята, помогите написать реализацию функции "getBloobyConstructor". Она может принимать произвольное количество аргументов вида{ x:111, getX: function(){ return this.x } }

Работать должно как-то так:
function getBloobyConstructor(){
   ...
}

const BloobyConstructor = getBloobyConstructor({
  x: 0,
  getX: function(){ return this.x; }
},{
  x: 1,
  getX: function(){ return this.__getX() + '  first'; }
},{
  x: 2,
  getX: function(){ return this.__getX() + '  second'; }
},{
  x: 3,
  getX: function(){ return this.__getX() + '  third'; }
});

const bloobyInstance = new BloobyConstructor;

console.log( bloobyInstance.getX() ) // 3 first second third


Проблема -- это как правильно реализовать метод "__getX"

UPD: Вот придумал такое извращение

function getBloobyConstructor() {
	return Array.prototype.reduce.call(arguments, (proto, obj, index, args) => {
		function C() {
		}

		C.prototype = Object.create(proto);

		for (let p in obj) {
			if (!obj.hasOwnProperty(p)) {
				continue;
			}

			C.prototype[p] = obj[p];
			if (index > 0 && typeof obj[p] === 'function') {
				C.prototype['__' + p] = setBaseMethod(p, proto);
			}
		}

		return index === args.length - 1 ? C : C.prototype;
	});

	/**
	 * @param {string} method
	 * @param {Object} proto
	 * @returns Function
	 */
	function setBaseMethod(method, proto) {
		let obj = {};
		obj[method] = proto[method];
		obj['__' + method] = proto['__' + method];

		return function () {
			let context = {};
			for (let p in proto) {
				if (this[p] && typeof this[p] !== 'function') {
					Object.defineProperty(context, p, {
						get: () => this[p],
						set: value => this[p] = value,
						enumerable: true,
						configurable: true
					});
				}
			}

			return Object.assign({}, context, obj)[method]();
		}
	}
}

Выглядит очень стрёмно, хотелось бы придумать решение покрасивее...
  • Вопрос задан
  • 144 просмотра
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы