JavaScript. Подробное руководство, 6-е издание, стр. 134
9.8.5. Подклассы и ECMAScript 5
В примере 9.22 демонстрируется порядок создания подклассов с использованием возможностей ECMAScript 5. В нем определяется класс
<b>stringSet,</b><b>AbstractWritableSet</b><b>Object.сreate()</b>Другой интересной особенностью этого примера является передача значения null функции
<b>Object.сreate()</b><b>hasOwnProperty()</b><b>in</b>Пример 9.22. <b>StringSet</b>
<b>function StringSet() {</b><b> this.set = Object.create(null); // Создать объект без прототипа</b><b> this.n = 0;</b><b> this.add.apply(this, arguments);</b><b>}</b><b>// Обратите внимание, что Object.create позволяет обеспечить наследование</b><b>// прототипа суперкласса и определить методы за счет единственного вызова.</b><b>// Поскольку при создании свойств мы не указываем значения атрибутов writable,</b><b>// enumerable и configurable, они по умолчанию получают значение false.</b><b>// Доступность методов только для чтения усложняет их переопределение в подклассах.</b><b>StringSet.prototype = Object.create(AbstractWritableSet.prototype, {</b><b> constructor: { value: StringSet },</b><b> contains: { value: function(x) { return x in this.set; } }.</b><b> size: { value: function(x) { return this.n; } },</b><b> foreach: { value: function(f,c) { Object.keys(this.set).forEach(f.c); } }.</b><b> add: {</b><b> value: function() {</b><b> for(var і = 0; і < arguments.length; i++) {</b><b> if (!(arguments[i] in this.set)) {</b><b> this.set[arguments[i]] = true;</b><b> this.n++;</b><b> }</b><b> }</b><b> return this;</b><b> }</b><b> ),</b><b> remove: {</b><b> value: function() {</b><b> for(var і = 0; і < arguments.length; i++){</b><b> if (arguments[i] in this.set) {</b><b> delete this.set[arguments[i]];</b><b> this, n--;</b><b> }</b><b> }</b><b> return this;</b><b> }</b><b> }</b><b>});</b>9.8.6. Дескрипторы свойств
В разделе 6.7 дается описание дескрипторов свойств, введенных стандартом ECMAScript 5, но там отсутствуют примеры, демонстрирующие различные случаи их использования. Мы завершим этот раздел, посвященный особенностям ECMAScript 5, расширенным примером, демонстрирующим многие операции со свойствами, допустимые в ECMAScript 5. Программный код в примере 9.23 добавляет в
<b>Object.prototype</b><b>properties()</b><b>hideProps()</b><b>freezeProps(),</b>Пример 9.23. Особенности свойств в ECMAScript 5
<b>/*</b><b>* Определяет метод properties() в Object.prototype, возвращающий объект, который</b><b>* представляет указанные свойства объекта, относительно которого был вызван метод</b><b>* (или все собственные свойства объекта, если метод был вызван без аргументов).</b><b>* Возвращаемый объект имеет четыре полезных метода:</b><b>* toString(), descriptors(), hide() и show().</b><b>*/</b><b>(function namespace() { // Обернуть все в частную область видимости функции</b><b> // Эта функция будет превращена в метод всех объектов</b><b> function properties() {</b>