JavaScript. Подробное руководство, 6-е издание, стр. 110

<b>                     statics) // Свойства класса: копируются в конструктор</b>

<b>{</b>

<b>  if (methods) extend(constructor.prototype, methods); </b>

<b>  if (statics) extend(constructor, statics);</b>

<b>  return constructor;</b>

<b>}</b>

<b>// Простейший вариант нашего класса Range </b>

<b>var SimpleRange =</b>

<b>    defineClass(function(f,t) { this.f = f; this.t = t; },</b>

<b>      {</b>

<b>        includes: function(x) { return this.f&lt;=x &amp;&amp; x &lt;= this.t;},</b>

<b>        toString: function() { return this.f + &quot;...&quot; + this.t; }</b>

<b>      },</b>

<b>      { upto: function(t) { return new SimpleRange(0, t); } });</b>

В примере 9.3 приводится более длинное определение класса. В нем создается класс, представляющий комплексные числа, и демонстрируется, как имитировать члены класса в стиле Java. Здесь все делается «вручную» - без использования функции

<b>defineClass(),</b>
представленной выше.

Пример 9.3. Complexes: Класс комплексных чисел

<b>/*</b>

<b> * Complex.js:</b>

<b> * В этом файле определяется класс Complex, представляющий комплексные числа.</b>

<b> * Напомню, что комплексные числа представляют собой сумму вещественной и мнимой части,</b>

<b> * где множитель і в мнимой части - это квадратный корень из -1.</b>

<b>*/</b>

<b>/*</b>

<b> * Функция-конструктор определяет поля экземпляра r и і</b>

<b> * в каждом создаваемом экземпляре.</b>

<b> * Эти поля хранят значения вещественной и мнимой частей комплексного числа:</b>

<b> * они хранят информацию, уникальную для каждого объекта.</b>

<b>*/</b>

<b>function Complex(real, imaginary) {</b>

<b>  if (isNaN(real) || isNaN(imaginary)) // Убедиться, что аргументы - числа.</b>

<b>    throw new ТуреЕггог(); // Иначе возбудить исключение,</b>

<b>  this.r = real;         // Вещественная часть числа,</b>

<b>  this.і = imaginary;    // Мнимая часть числа.</b>

<b>}</b>

<b>/*</b>

<b> * Методы экземпляров класса определяются как свойства-функции объекта-прототипа.</b>

<b> * Методы, определяемые ниже, наследуются всеми экземплярами и обеспечивают общность</b>

<b> * поведения класса. Обратите внимание, что методы экземпляров в JavaScript</b>

<b> * должны использовать ключевое слово this для доступа к полям экземпляра.</b>

<b>*/</b>

<b>// Складывает комплексное число that с текущим и возвращает сумму в виде нового объекта. </b>

<b>Complex.prototype.add = function(that) {</b>

<b>  return new Complex(this.r + that.r, this.і + that.і);</b>

<b>};</b>

<b>// Умножает текущее комплексное число на число that и возвращает произведение.</b>

<b>Complex.prototype.mul = function(that) {</b>

<b>  return new Complex(this.r * that.r - this.і * that.і, this.r * that.і + this.і * that.r);</b>

<b>}:</b>

<b>// Возвращает вещественный модуль комплексного числа. Он определяется </b>

<b>// как расстояние до числа на комплексной плоскости от точки (0.0).</b>

<b>Complex.prototype.mag = function() {</b>

<b>  return Math.sqrt(this.r*this.r + this.i*this.i);</b>

<b>};</b>

<b>// Возвращает комплексное число с противоположным знаком.</b>

<b>Complex.prototype.neg = function() { return new Complex(-this.r, -this.i); };</b>

<b>// Преобразует объект Complex в строку в понятном формате.</b>

<b>Complex.prototype.toString = function() { </b>

<b>  return &quot;{&quot; + this.r + &quot;,&quot; + this.i + '}';</b>

<b>};</b>

<b>// Проверяет равенство данного комплексного числа с заданным.</b>

<b>Complex.prototype.equals = function(that) {</b>

<b>  return that != null &amp;&amp;                  // должно быть определено, не равно null</b>

<b>  that.constructor === Complex &amp;&amp;         // и быть экземпляром Complex</b>

<b>  this.r === that.r &amp;&amp; this.i === that.i; // и иметь те же значения.</b>

<b>};</b>

<b>/*</b>

<b>* Поля класса (например, константы) и методы класса определяются как свойства</b>