Источник: 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;
};
}