2015-01-27 3 views
0

Здравствуйте, Javascript ninjas! У меня довольно сложная проблема для решения и не нашел удовлетворительного решения.Обход ограничения __proto__ в IE9 и IE10

Для очень специфичной структуры Javascript, которую я разрабатываю, мне нужно уметь установить свойство динамически созданной функции __proto__. У меня есть какая-то фабрика общих функций и вам нужно иметь общие определения для созданных функций. Я бы не стал спорить, или нет, это хорошая практика, поскольку мне действительно нужно добиться этого по вполне веским причинам.

Вот небольшой пример QUnit, который отлично работает на Chrome последней версии, которая показывает, что мне нужно:

var oCommonFunctionProto = {}; 
var fnCreateFunction = function() { 
    var fnResult = function() {}; 
    fnResult.__proto__ = oCommonFunctionProto; // DOES NOT WORK WITH IE9 OR IE10 
    return fnResult; 
}; 
var fn1 = fnCreateFunction(); 
oCommonFunctionProto.randomMethod = function() { return 10; }; 
equal(fn1.randomMethod(), 10, "__proto__ has been set properly"); 
var oInstance = new fn1(); // fn1 is instantiable 

Как вы можете видеть на этом коде, что добавляется oCommonFunctionProto будет доступна непосредственно на любой функции возвращенного методом fnCreateFunction. Это позволяет построить цепочку прототипов на функциональных объектов (как это часто делается на цепочки прототипов объектов

Вот проблема:. __proto__ свойство неизменен в IE9 и IE10 и, к сожалению, мне действительно нужно, чтобы быть совместимым с теми, . браузеры Кроме того:

  1. я не могу использовать любую третью сторону мне нужен полностью функциональный код, который не зависит ни от чего другого
  2. Как вы можете видеть, randomMethod был добавлен после создания.. функция. Мне действительно нужен прототип ype, как в моих сценариях, эти объекты меня изменят после создания функций. Просто дублирование свойств oCommonFunctionProto в прототипе функции не будет работать.
  3. Я совершенно нормально с субоптимальным кодом, если он выполняет эту работу. Это будет взлом совместимости только для IE9/IE10. Пока я работаю, я буду счастлив.
  4. Это может быть в порядке, чтобы установить __proto__ при создании функции. Лучше, если я смогу это сделать потом, но если у меня нет выбора, это может быть приемлемым.

Я пробовал каждый взломанный я мог, но не нашел способа обойти это ограничение на IE9/IE10.

TL; Я должен уметь устанавливать __proto__ на функцию javascript без помощи сторонних разработчиков в IE9 и IE10.

+0

Некоторые вопросы ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** * Но я не знаю достаточно об этой области, чтобы узнать, являются ли они реальными дубликатами вашего вопроса. – Barmar

+1

В частности, http://stackoverflow.com/questions/8413505/proto-for-ie9-or-ie10?rq=1 – Barmar

+0

Уже видел, что один (и другие на самом деле), но это не позволяло мне делать то, что я необходимость. Я действительно в порядке с решениями, не использующими __proto__, если он выполняет эту работу.Спасибо за ваш комментарий в любом случае :) – Sisyphe

ответ

1

на основе других ответов и дискуссии, похоже, что это просто не возможно для IE < 11.

я, наконец, упал прототип цепь, будь то объекты или функцию, в пользу уплощенного прототипа и уведомления, когда логический «Родительский» прототип изменяется на обновление «дочернего» прототипа соответственно.

Смежные вопросы