Ребята, помогите написать реализацию функции "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]();
}
}
}
Выглядит очень стрёмно, хотелось бы придумать решение покрасивее...