curly - google javascript style guide на русском



JavaScript: Какие опасности в распространении Array.prototype? (7)

Руководство по стилю JavaScript в JavaScript советует не распространять Array.prototype . Однако я использовал Array.prototype.filter = Array.prototype.filter || function(...) {...} Array.prototype.filter = Array.prototype.filter || function(...) {...} как способ иметь его (и подобные методы) в браузерах там, где их не существует. На самом деле MDN предоставляет аналогичный пример .

Я знаю о проблемах Object.prototype , но Array не является хеш-таблицей.

Какие проблемы могут возникнуть при распространении Array.prototype которые заставили Google посоветовать против этого?


Большинство людей пропустили этот момент. На мой взгляд, хорошая функциональность Polyfilling или Array.prototype.filter такая как Array.prototype.filter так что она работает в старых браузерах. Не слушайте ненавистников. Mozilla даже показывает вам, как это сделать на MDN. Обычно совет для Array.prototype или других собственных прототипов может Array.prototype к одному из них:

  1. for..in может работать неправильно
  2. Кто-то может также захотеть расширить Array с тем же именем функции
  3. Он может работать неправильно в каждом браузере, даже с помощью прокладки.

Вот мои ответы:

  1. Вам не нужно использовать for..in на Array's обычно. Если вы это сделаете, вы можете использовать hasOwnProperty чтобы убедиться, что он является законным.
  2. Array.prototype.filter только туземцев, когда вы знаете, что делаете это только один, или когда это стандартный материал, такой как Array.prototype.filter .
  3. Это раздражает и укусило меня. У старого IE иногда возникают проблемы с добавлением такого рода функций. Вам просто нужно посмотреть, работает ли это в каждом конкретном случае. Для меня проблема, с которой я столкнулась, заключалась в добавлении Object.keys в IE7. Казалось, что он прекратил работать при определенных обстоятельствах. Ваш пробег может отличаться.

Проверьте эти ссылки:

Удачи!


Вы можете легко создать кое-что из песочницы с библиотекой poser .

Взгляните на https://github.com/bevacqua/poser

var Array2 = require('poser').Array();
// <- Array

Array2.prototype.eat = function () {
  var r = this[0];
  delete this[0];
  console.log('Y U NO .shift()?');
  return r;
};

var a = new Array2(3, 5, 7);

console.log(Object.keys(Array2.prototype), Object.keys(Array.prototype))

Некоторые люди используют for ... in циклах для повторения массивов. Если вы добавите метод в прототип, цикл также попытается выполнить итерацию по этому ключу. Конечно, вы не должны использовать его для этого, но некоторые люди все равно.


Расширение Array.prototype в вашем собственном коде приложения безопасно (если вы не используете for .. in на массивах, и в этом случае вам нужно заплатить за это и повеселиться, рефакторинг их).

Расширение собственных объектов хоста в библиотеках, которые вы намерены использовать другим, не круто. Вы не имеете права коррумпировать окружающую среду других людей в своей собственной библиотеке.

Либо сделайте это за дополнительным методом, например lib.extendNatives() либо установите [].filter как требование.

Расширение аборигенов и хост-объектов


Функция, которую вы переопределяете, может использоваться внутренними вызовами javascript, что может привести к неожиданным результатам. Это одна из причин для руководства

Например, я перепробовал функцию indexOf массива и перепутал доступ к массиву с помощью [].


Я дам вам баллы с ключевыми предложениями из превосходной статьи Николаса Закаса. Поддерживаемый JavaScript: не изменяйте объекты, которые у вас нет :

  • Надежность : «Простое объяснение заключается в том, что корпоративный программный продукт нуждается в согласованной и надежной среде исполнения, которая может быть пригодна для обслуживания».
  • Несовместимые реализации : «Еще одна опасность изменения объектов, которыми вы не владеете, - это возможность именования коллизий и несовместимых реализаций».
  • Что, если бы все это сделали? : «Проще говоря: если бы каждый из вашей команды изменил объекты, которые у них не были, вы быстро столкнетесь с именованием столкновений, несовместимыми реализациями и кошмарами для обслуживания».

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


Prototype делает это. Это зло. Следующий фрагмент демонстрирует, как это может привести к неожиданным результатам:

<script language="javascript" src="https://ajax.googleapis.com/ajax/libs/prototype/1.7.0.0/prototype.js"></script>
<script language="javascript">
  a = ["not", "only", "four", "elements"];
  for (var i in a)
    document.writeln(a[i]);
</script>

Результат:

not only four elements function each(iterator, context) { var index = 0; . . .

и около 5000 символов.





prototype