#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
и у нас есть множество способов скрыть эти строки сложно читать.