Зачем присваивать строку ‘prototype’ переменной, а затем использовать ее для установки прототипа объекта?

#javascript #properties #prototype

#javascript #свойства #прототип

Вопрос:

Я только что наткнулся на этот код для полизаполнения списка классов, и я не могу понять, почему разработчик решил сделать следующее:

 var protoProp = "prototype";
  

… далее в коде…

 ClassList[protoProp] = [];
  

Что не так с ClassList.prototype = [] ? Я не могу придумать ни одной причины, по которой они могли бы это сделать. Чего я не понимаю?

Ответ №1:

Похоже, что это для минимизации, где это значение может быть преобразовано в

 ClassList[v]=[];
  

вместо

 ClassList.prototype = [];
  

protoProp Переменная используется в нескольких местах вместо prototype и сэкономила бы всего несколько байтов

Комментарии:

1. Очень хороший момент. Отдельно это означает, что минификатор, отличный от переименования свойства, оставит это имя свойства в покое, что, очевидно, важно. Я бы ожидал, что любой мало-мальски приличный человек знает, что нужно оставить prototype в покое, но…

2. @T.J.Crowder — действительно, я не думаю, что какой-либо из минификаторов изменил бы строковое значение или возился бы со встроенными свойствами, такими как prototype . Мы, конечно, постоянно сталкиваемся с такого рода оптимизацией с window , document и другими распространенными ссылками, которые невозможно минимизировать без использования какой-либо переменной, но я не думаю, что видел это с prototype раньше, или, по крайней мере, я специально не замечал этого.

3. Однако мне интересно, почему минификатор не смог выполнить эту оптимизацию самостоятельно…

4. @Bergi — Я предполагаю, что изменение обозначения точек на квадратные скобки, чтобы сэкономить несколько байтов, также может вызвать некоторые непреднамеренные проблемы (хотя не уверен, какие именно?)

5. Я не думаю, что это возможно. Возможно, просто недостаточно просто найти надлежащую область видимости для строковых констант.

Ответ №2:

в моем последнем проекте мне нужно было минимизировать и запутать мой код, и я конвертирую все объекты следующим образом

 arr.length ===> arr["length"];
str.replace("a","") ===> str["replace"]("a","");
Element.prototype.colorize ===> Element["prototype"]["colorize"]
  

и каждая вещь работает очень хорошо
теперь у меня есть строки
length , replace , prototype , colorize
и у нас есть множество способов скрыть эти строки сложно читать.