Я прочитал несколько статей, которые предполагают, что расширение встроенных объектов в JavaScript - плохая идея. Скажем, например, добавить first
функции Array
...Расширение встроенных типов JavaScript - это зло?
Array.prototype.first = function(fn) {
return this.filter(fn)[0];
};
Великие, так что теперь я могу получить первый элемент, основанный на предикате. Но что происходит, когда ECMAScript-20xx решает добавить сначала в спецификацию и реализовать ее по-другому? - ну, вдруг, мой код предполагает нестандартную реализацию, разработчики теряют веру и т.д.
Итак, я решил создать свой собственный тип ...
var Enumerable = (function() {
function Enumerable(array) {
this.array = array;
}
Enumerable.prototype.first = function (fn) {
return this.array.filter(fn)[0];
};
return Enumerable;
}());
Так что теперь, я может передать массив в новый Enumerable и вызвать сначала экземпляр Enumerable. Большой! Я уважал спецификацию ECMAScript-20xx, и я все еще могу делать то, что хочу.
Затем выдается спецификация ES20XX + 1, которая вводит тип Enumerable
, который даже не имеет первого метода. Что происходит сейчас?
Суть этой статьи сводится к этому; Насколько плохо это распространять встроенные типы и как мы можем избежать столкновения реализации в будущем?
Примечание: Использование пространств имен может быть одним из способов борьбы с этим, но опять же, это не так!
var Collection = {
Enumerable: function() { ... }
};
Что происходит, когда спецификация ECMAScript вводит Collection
?
Нельзя защищать от столкновений. Лучшее, что вы можете сделать, - назвать вас сущностями как можно более уникальными и иметь как можно меньше глобальных элементов, например, с пространствами имен. И пересечь пальцы. –
См. Также [Могу ли я безопасно расширять встроенные классы javascript?] (Http://stackoverflow.com/q/8262751/1048572), [Расширение встроенных встроенных функций] (http://perfectionkills.com/extending-native-builtins), [JavaScript: Какие опасности возникают при расширении Array.prototype?] (Http://stackoverflow.com/q/8859828/1048572), [Использует Prototype для расширения собственных объектов?] (Http://stackoverflow.com/q/10197174/1048572), [Почему расширение родных объектов является плохой практикой?] (Http://stackoverflow.com/q/14034180/1048572), [Повторное расширение родных прототипов после ECMAScript 5] (http://stackoverflow.com/q/11781878/1048572) и многое другое. – Bergi
Подсказка: ваш метод 'first' уже доступен для массивов под именем [' find'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find) начиная с ES6. – Bergi