Я создаю простую библиотеку проверки, и мне нужно использовать прокси, потому что я хочу принимать пользовательские правила проверки в качестве объекта цепочки. Я что-то создаю, и оно работает правильно в современных браузерах, но не работает в IE11, я пробовал с прокси-полифиллом, но он тоже не работает должным образом. Мой прокси-код ниже.
function contextProxy(context) {
return new Proxy(context, {
get(obj, prop) {
if (prop in obj) {
return obj[prop];
}
const newContext = contextProxy(context._clone());
if (definedRules.hasOwnProperty(prop)) {
return newContext._takeRule(definedRules[prop]);
}
if (customRules.hasOwnProperty(prop)) {
return newContext._takeRule(customRules[prop]);
}
},
});
}
И я использую этот прокси;
function validationL() {
return contextProxy(new ValidationLContext());
}
И я определил объект Rules;
const definedRules = {
numeric: function () {
return function (text) {
return /^\d+$/.test(text);
};
},
lowercase: function () {
return function (text) {
return /^([a-z]+\s*)+$/.test(text);
};
},
uppercase: function () {
return function (text) {
return /^([A-Z]+\s*)+$/.test(text);
};
},
minLength: function (min) {
return function (text) {
return text.length >= min;
};
},
maxLength: function (max) {
return function (text) {
return text.length <= max;
};
},
alphaNumeric: function () {
return function (text) {
return /^([a-zA-Z0-9 _-]+)$/i.test(text);
};
},
specialChars: function () {
return function (text) {
return !/^([a-zA-Z0-9 _-]+)$/i.test(text);
};
},
email: function () {
return function (text) {
return /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(
text
);
};
}
};
ValidationLContext.js
function ValidationLContext(isNot = false, chain = []) {
this.chain = chain;
this.isNot = isNot;
}
ValidationLContext.prototype.not = function () {
this.isNot = true;
return this;
};
ValidationLContext.prototype._takeRule = function (ruleFn) {
return (...args) => {
this.chain.push({ fn: ruleFn.apply(this, args), isNot: this.isNot });
if (this.isNot) {
this.isNot = false;
}
return this;
};
};
ValidationLContext.prototype.validate = function (text) {
return this.chain.every((c) =>
c.isNot ? !c.fn.call(this, text) : c.fn.call(this, text)
);
};
ValidationLContext.prototype._clone = function () {
return new ValidationLContext(this.isNot, this.chain);
};
export default ValidationLContext;
Итак, использование библиотеки так;
validationL().numeric().minLength(3).validate("123");
validationL().not().numeric().minLength(3).validate("123");
Я могу использовать, как указано выше, в современных браузерах, таких как Chrome, но когда я пытаюсь использовать IE11, работает только функция not(), поэтому могут работать только функции объектов. Кто-нибудь может мне с этим помочь.
=>
и...
вообще не работают в IE - person mplungjan   schedule 04.11.2020validationL().not.numeric.validate(123)
. - person Bergi   schedule 05.11.2020