Свойства объекта Object
constructor | Хранит ссылку на функцию-конструктор, с помощью которой создан экземпляр объекта. |
prototype | Возвращает ссылку на прототип класса объектов. Изменять прототип встроенных объектов нельзя, тогда как пользовательских можно. Это свойство "класса", а не экземпляра, поэтому оно применяется не к экземпляру объекта, а к его конструктору Object. |
propertyIsEnumerable(имя) | Логическое свойство, возвращающее true, если указанное в качестве параметра свойство объекта существует и доступно при переборе свойств в цикле for...in. |
Используя свойство constructor, которое наследуется также и всеми объектами JavaScript, можно проверить его принадлежность классу объектов. Сравнивать значение этого свойства надо с конструктором соответствующего объекта (просто имя конструктора). Для пользовательского объекта этим именем является имя соответствующей функции-конструктора (см. урок 9), а для встроенных объектов следующие ключевые слова — String, Date, Function, Array, Boolean, Number, Object:
var str = "xxxxxx";
var obj = new Object();
(str.constructor == String) ? true : false; // true
(obj.constructor == String) ? true : false; // false
(obj.constructor == Object) ? true : false; // true
Свойство prototype позволяет добавлять свойства и методы к "классу" объектов. Оно наследуется также каждым объектом JavaScript (пользовательским или встроенным кроме объектов Global и Math). После добавления свойств и методов к прототипу создание объектов этого класса приводит к тому, что у всех объектов будут существовать добавленные свойства и методы. Так как все объекты "происходят" от объекта Object, то добавление свойств и методов к его прототипу приводит к созданию соответствующих свойств и методов у всех объектов JavaScript.
4Пример 10. Добавление свойств и методов ко всем объектам
Добавим к прототипу объекта Object метод, возвращающий строку с названиями и значениями всех свойств объекта.
Для этого прежде всего создадим функцию props(), выполняющую указанное действие. В JavaScript есть специальный цикл for...in, который предназначен для просмотра всех свойств объекта (встроенного или пользовательского). На каждом шаге цикла его переменная хранит имя свойства, а доступ к значению этого свойства можно получить, выполнив для объекта операцию индексации со строковым индексом, равным имени свойства. Например, к свойству constructor объекта obj класса Object можно обратиться не только с использованием точечной нотации obj.constructor, но и с помощью индекса "constructor" следующим образом obj["constructor"]. (Это справедливо для любого объекта JavaScript.)
function props() {
var s = ""
for(var i in this){
s += i + ': ' + this[i] + '<br>';
}
return s;
}
Здесь следует, забегая вперед, пояснить использование ключевого слова this в функциях JavaScript. Оно используется исключительно в функциях, реализующих методы объектов, и имеет смысл "этот объект". Когда добавляется новый метод к прототипу встроенного объекта, то в реализующей его функции следует каким-то образом ссылаться на экземпляр объекта, который впоследствии будет создан. Именно ключевое слово this и реализует эту функциональность. Поэтому в нашей функции props() цикл будет осуществляться по всем свойствам экземпляра объекта, ассоциированный с этой функцией метод которого будет вызываться. А конструкция this[i] будет возвращать значение очередного свойства этого объекта.
Теперь остается добавить новое свойство к прототипу объектов класса Object. Назовем его propList и присвоим ему ссылку на функцию props():
Object.prototype.propList = props;
Обращаем внимание, что присваивается ссылка props на объект Function, а не вызов функции props()!
Создадим объект String:
var s = "*********";
Теперь он имеет метод propList(), и следующий оператор распечатает все свойства объекта s с их значениями в окне браузера:
document.write(s.propList())
Внимание! Метод propList() вызывается как обычная функция. Если бы для выполнения реализующей его функции props() требовались параметры, то их следовало бы передать при вызове метода propList() объекта s.
Не все свойства объектов могут быть перечислены в цикле for...in. Для проверки доступности свойства в указанном цикле у объекта Object (и, естественно, у всех объектов JavaScript) есть логическое свойство propertyIsEnumerable(имя), определяющее доступность свойства в цикле for...in. Имя свойства передается как строка. Исключение — свойства массива, представляющие собой индексы эго элементов. В этом случае имя может быть передано в свойство propertyIsEnumerable как число, и как строка, содержащая число. Заметим, что все добавляемые пользователем к встроенным объектам свойства являются перечисляемые, тогда как их собственные встроенные свойства не все могут быть перечисляемыми.
Дата добавления: 2018-09-24; просмотров: 399;