JavaScript. Подробное руководство, 6-е издание, стр. 122
Заимствоваться могут не только методы класса
<b>Array</b><b>toString()</b><b>equals(),</b><b>Range, Complex</b><b>Card</b><b>equals(),</b><b>equals()</b><b>Range.prototype.equals = generic.equals;</b>Обратите внимание, что метод
<b>generic.equals()</b><b>equals().</b>Пример 9.9. Обобщенные методы, пригодные для заимствования
<b>var generic = {</b><b> // Возвращает строку, включающую имя функции-конструктора, если доступно,</b><b> // и имена и значения всех неунаследованных свойств, не являющихся функциями.</b><b> toString: function() {</b><b> var s = '[';</b><b> // Если объект имеет конструктор и конструктор имеет имя, использовать</b><b> // это имя класса как часть возвращаемой строки. Обратите внимание, что</b><b> // свойство name функций является нестандартным и не поддерживается повсеместно,</b><b> if (this.constructor && this.constructor.name) s += this.constructor.name + ";</b><b> // Теперь обойти все неунаследованные свойства, не являющиеся функциями</b><b> var n = 0;</b><b> for(var name in this) {</b><b> if (!this.hasOwnProperty(name)) continue; // пропустить унаслед.</b><b> var value = this[name];</b><b> if (typeof value === ’function") continue; // пропустить методы</b><b> if (n++) s += ", ";</b><b> s += name + '=' + value;</b><b> }</b><b> return s + ']';</b><b> },</b><b> // Проверить равенство, сравнив конструкторы и свойства экземпляров объектов this</b><b> // и that. Работает только с классами, свойства экземпляров которых являются</b><b> // простыми значениями и могут сравниваться с помощью оператора ===.</b><b> // Игнорировать специальное свойство, добавляемое классом Set.</b><b> equals: function(that) {</b><b> if (that == null) return false;</b><b> if (this.constructor !== that.constructor) return false;</b><b> for(var name in this) {</b><b> if (name === "|**objectid**|") continue; // пропустить спец. св.</b><b> if (!this.hasOwnProperty(name)) continue; // пропустить унасл. св.</b><b> if (this[name] !== that[name]) return false; // сравнить значения</b><b> }</b><b> return true; // Объекты равны, если все свойства равны.</b><b> }</b><b>};</b>9.6.6. Частные члены
В классическом объектно-ориентированном программировании зачастую целью инкапсуляции, или сокрытия данных объектов внутри объектов, является обеспечение доступа к этим данным только через методы объекта и запрет прямого доступа к важным данным. Для достижения этой цели в таких языках, как Java, поддерживается возможность объявления «частных» (
<b>private</b>Реализовать частные поля экземпляра можно с помощью переменных (или аргументов), хранящихся в замыкании, образуемом вызовом конструктора, который создает экземпляр. Для этого внутри конструктора объявляются функции (благодаря чему она получает доступ к аргументам и локальным переменным конструктора), которые присваиваются свойствам вновь созданного объекта. Этот прием демонстрируется в примере 9.10, где он используется для создания инкапсулированной версии класса
<b>Range</b><b>from</b><b>to</b><b>from</b><b>to</b><b>from()</b><b>to()</b><b>Range</b><b>Range</b><b>from()</b><b>to().</b>Пример 9.10. Класс Range со слабо инкапсулированными границами
<b>function Range(from, to) {</b>