Прокси-сервер JavaScript не работает должным образом на ie11

Я создаю простую библиотеку проверки, и мне нужно использовать прокси, потому что я хочу принимать пользовательские правила проверки в качестве объекта цепочки. Я что-то создаю, и оно работает правильно в современных браузерах, но не работает в 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(), поэтому могут работать только функции объектов. Кто-нибудь может мне с этим помочь.


person zblash    schedule 04.11.2020    source источник
comment
=> и ... вообще не работают в IE   -  person mplungjan    schedule 04.11.2020
comment
Я знаю, и веб-пакет конвертирует их, поэтому проблема не в них.   -  person zblash    schedule 04.11.2020
comment
Это было бы полезной информацией для включения в ваш вопрос. Так какие ошибки в консоли?   -  person mplungjan    schedule 04.11.2020
comment
IE11 не выдает никаких ошибок, а также не работает   -  person zblash    schedule 04.11.2020
comment
Учитывая, что правила известны заранее, прокси для этого не нужны. Геттеров (или даже просто динамически определенных методов) будет достаточно.   -  person Bergi    schedule 04.11.2020
comment
@Bergi извините, я не понимаю, как я могу использовать геттеры для этого использования validationL().numeric().minLength(3).validate(123)   -  person zblash    schedule 05.11.2020
comment
Нет, для этого даже геттеры не нужны. Они понадобятся вам для чего-то вроде validationL().not.numeric.validate(123).   -  person Bergi    schedule 05.11.2020
comment
Я предлагаю вам попытаться вывести некоторую информацию в консоль на каждом шаге вашего кода и попытаться отладить код JS с помощью инструментов разработчика, которые могут помочь вам найти проблемный код, где выполнение зависает. Затем вы можете проверить эту строку кода и посмотреть, поддерживаются ли методы и свойства, которые вы использовали в коде, в браузере IE или нет. Это может помочь сузить проблему.   -  person Deepak-MSFT    schedule 05.11.2020
comment
Также, возможно, опубликуйте минимально воспроизводимый пример с использованием баблизированного кода из источника инструментов разработчика IE11.   -  person mplungjan    schedule 05.11.2020
comment
Я попытался с консольным журналом для исключения перехвата и обнаружил проблему. Проблема связана с внешними функциями, такими как числовая ошибка прокси-сервера для числового, но Chrome не выдает никаких ошибок. Ошибка IE — это ошибка ссылки. Я думаю, что polyfill не работает должным образом, как встроенный прокси   -  person zblash    schedule 05.11.2020
comment
Мне нужно использовать как validationL().numeric().minLength(3).validate(123); потому что. Я даю аргумент таким функциям, как minLength   -  person zblash    schedule 05.11.2020
comment
Если возможно, попробуйте предоставить изображение сообщения об ошибке, которое может помочь найти подсказку о проблеме. Если возможно, явно транспилируйте код и попробуйте выполнить тест с ним в браузере IE. Посмотрите, работает это или нет.   -  person Deepak-MSFT    schedule 05.11.2020
comment
Я не могу сделать снимок прямо сейчас, потому что я на Linux, но я думаю, что нашел проблему. Проблема в том, что proxy-polyfill не предоставляет всю функциональность, встроенную в Proxy, и я думаю, что это невозможно, поэтому я решил изменить структуру моей библиотеки. Спасибо всем за помощь   -  person zblash    schedule 05.11.2020
comment
Судя по предыдущему комментарию, вы нашли основную причину проблемы. После изменения структуры библиотеки вы можете попытаться опубликовать свое решение, так как ответ на этот вопрос может помочь другим членам сообщества в будущем решить аналогичные проблемы. Спасибо за понимание.   -  person Deepak-MSFT    schedule 06.11.2020