Я прочитал несколько статей, которые предполагают, что расширение встроенных объектов в JavaScript - плохая идея. Скажем, например, я добавляю функцию first
к Array
...
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
?