Источник: http://learn.javascript.ru/native-prototypes
Встроенные в JavaScript объекты можно расширять и изменять. Что интересно, изменение некоторых из них повлияет и на примитивы. Можно добавить методы стандартным числам, строкам, и не только.Строки, числа, булевы значения в JavaScript являются примитивами. Но есть также и встроенные функции-конструкторы String, Number, Boolean.
Yj единственное допустимое использование этих конструкторов — запуск в режиме обычной функции для преобразования типа. Например, Number("12") преобразует в число, так же как +"12".
Несмотря на то, что в явном виде объекты String, Number, Boolean
не создаются, их прототипы всё же используются. Они хранят методы строк, чисел, булевых значений.
Например, метод slice для строк хранится как String.prototype.slice.
При вызове метода на примитиве, например, "строка".slice(1), происходит следующее:
String.Посмотрим на интересное следствие такого поведения. Попытаемся добавить свойство строке:
var hello = "Привет мир!";
hello.test = 5; // запись свойства сработала, ошибки нет...
alert(hello.test); // ...читаем свойство -- выдаёт undefined!
Будет выведено undefined, так как присвоение произошло во временный объект, созданный для обработки обращения к свойству примитива. Этот временный объект тут же уничтожился вместе со свойством.
Конечно же, браузеры при таком преобразовании применяют оптимизации и, возможно, дополнительные объекты не создаются, но логика поведения — именно такая как описана.
А значит, методы для строк, чисел, булевых значений можно изменять и добавлять свои, в прототип…
Встроенные прототипы можно изменять. В том числе — добавлять свои методы.
Есть объекты, которые не участвуют в циклах for..in, например строки, функции… С ними уж точно нет такой проблемы, и в их прототипы, пожалуй, можно добавлять свои методы.
Но здесь есть свои «за» и «против»:
Допустимо изменение прототипа встроенных объектов, которое добавляет поддержку метода из современных стандартов в те браузеры, где её пока нет.
Например, добавим Object.create(proto) в старые браузеры:
показать чистый исходник в новом окнеСкрыть/показать номера строкпечать кода с сохранением подсветки
if (!Object.create) {
Object.create = function(proto) {
function F() {}
F.prototype = proto;
return new F;
};
}