JavaScript. Подробное руководство, 6-е издание, стр. 133
<b> }</b><b> // Создать перечислимые, ненастраиваемые свойства с методами доступа</b><b> Object.defineProperties(this, {</b><b> from: {getigetFrom, </b><b> set:setFrom, </b><b> enumerable:true,</b><b> configurable:false},</b><b> to: { get: getTo,</b><b> set: setTo,</b><b> enumerable:true,</b><b> configurable:false }</b><b> });</b><b>}</b><b>// Настройка объекта-прототипа осталась такой же, как и в предыдущих примерах.</b><b>// Обращение к методам экземпляров чтения свойств from и to выполняется так,</b><b>// как если бы они были простыми свойствами.</b><b>Range.prototype = hideProps({</b><b> constructor: Range,</b><b> includes: function(x) {</b><b> return this.from <= x && x <= this.to: },</b><b> foreach: function(f) {</b><b> for(var x=Math.ceil(this.from);x<=this.to;x++) f(x);},</b><b> toString: function() { return "(" + this, from + ”..." + this, to + ")"; }</b><b>});</b>9.8.4. Предотвращение расширения класса
Возможность расширения классов за счет добавления новых методов в объект-прототип обычно рассматривается как характерная особенность языка JavaScript. Стандарт ECMAScript 5 позволяет при желании предотвратить такую возможность. Функция
<b>Object.preventExtensions()</b><b>Object.seal()</b><b>Object.prototype</b><b>Object.seal(Object.prototype);</b>Другая динамическая особенность языка JavaScript - возможность замены методов объекта:
<b>var original_sort_method = Array.prototype.sort;</b><b>Array.prototype.sort = function() {</b><b> var start = new Date();</b><b> original_sort_method.apply(this, arguments);</b><b> var end = new Date();</b><b> console.log("Сортировка массива заняла " + (end - start) +</b><b> " миллисекунд.");</b><b>};</b>Предотвратить такую замену можно, объявив методы экземпляров доступными только для чтения. Сделать это можно с помощью вспомогательной функции
<b>freezeProps(),</b><b>Object.freeze(),</b><b>Object.seal(),</b>Свойства, доступные только для чтения, обладают одной особенностью, о которой необходимо помнить при работе с классами. Если объект
<b>о</b><b>р</b><b>о.р</b><b>о</b><b>Object.defineProperty(), Object.defineProperties()</b><b>Object.create(),</b>На практике обычно не требуется блокировать возможность изменения объектов-прототипов таким способом, но в некоторых случаях предотвращение расширения объектов может оказаться полезным. Вспомните фабричную функцию
<b>enumeration()</b><b>values</b><b>enumeration()</b><b>Object.freeze(enumeration.values);</b><b>Object.freeze(enumeration);</b>Обратите внимание, что применение функции
<b>Object.freeze()</b><b>objectId</b><b>objectId</b>