Здравствуйте!
Делаю функцию, которая поможет более удобно добавлять функции через Object.defineProperties().
Она помогает автоматически создать get, set, обёртку(чтоб функция не выполнялась автоматически через get), не писать объекты с параметрами (opt:{value:val})
И всё это, конечно, делается с помощью for(nm in vl){}
Цикл перебирает объект, передаваемый в функцию, гинерирует объекты с параметрами (обычно в качестве value выступает значение свойства nm, но если значение=объект, то проверяется, есть ли там свойства с именами параметров(на случай, если нужно их добавить, но не как параметры, то есть свойство isParam). Если есть, то ничего не генерируется, а просто добавляется в объект tmp, который после итерации добавляется через .defineProperties() )
вот код:
window.EX = function (f1, f2) {
/**упрощение работы с get и set.
возвращает {get:function(){return f1;},set:f2},
если f2=true, то set:f1, если f2 нет, то set:undefined
**/
return {
get: function () {
return f1;
},
set: f2 === true ? f1 : f2 || undefined
};
};
EX.auto = function (f1, f2) {
/**тоже упрощает работу с get и set.
возвращает:
если f2=setget, EX(f1,true)
если f2=set, {set:f1}
если f2=get, {get:function(){return f1;}}
если f2=что-то-другое, {get:f1}
**/
switch (f2) {
case "setget":
return EX(f1, !!1);
case "set":
return {
set: f1
};
case "get":
return {
get: function () {
return f1;
}
};
default:
return {
get: f1
}
}
};
Object.defineProperties(Object.prototype, {
Ainit: {
/**конструктор объектов.
принимает объект и помещает его свойства в тот, на котором вызван Init.
если объект содержит конструкции типа l:{set:...,get:...}(только как прямые потомки), то они будут использованы как get l или set l (isEnumerable,isConfigurable,isWritable).
если свойство isParam установлено в false l:{isParam:false}, то все свойства будут приниматься НЕ как параметры свойствa l (enumerable,configurable,writable,get,set)
также get и set можно создать, используя имя самой функции l:function get(){}-
get - создаст get с обёрткой
l:{
get:function (){
return get(){};
}
} - функция не будет выполняться сама
set - создаст set
setget - создаст set и get для одной функции
auto- создаст get без обёртки функции(она выполнится сама при вызове get)
**/
enumerable: false,
configurable: false,
writable: false,
value: function (vl) {
var tmp = {};
for (var nm in vl) {
var s = vl[nm] || {},
sn = s.name || "";
tmp[nm] = (!s.set && !s.get && !s.enumerable && !s.configurable && !s.writable && ["get","auto","setget","set"].indexOf(sn) === -1 && s.isParam !== true) || s.isParam === false ? {
enumerable: false,
configurable: true,
writable: true,
value: vl[nm]
}
: (s.constructor !== Function ? s : EX.auto(s, sn));
}
Object.defineProperties(this, tmp);
}
}
});
Подскажите, как можно более-менее оптимизировать это всё
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Нужно реализовать валидацию для поляВ поле можно вводить только латинские буквы, дефис и пробел
Делаю биг-дату, которая содержит в себе данные за каждый деньТребуется на фронте вставить календарь, благодаря которому можно выбрать дату...
Сегодня попробовал google closureЗаметил, что цифры в условиях он ставит на первое место:
Есть массив объектов со значениями id и parent_id