Js Drip #6 Конструкторы в JavaScript

Опубликовано Вт. 27 Январь 2015 в Translations

Вольный перевод JsDrip #6 Constructors in JavaScript

Не смотря на то, что конструкторы в JavaScript это мощный инструмент, мало кто ими пользуется. (возможно из-за их дурной славы). Но если ты реально хочешь научиться JavaScript, ты просто обязан знать как они работают.

Что такое конструктор? Это обычная функция, используемая с оператором new, который показывает что будет создан объект специального типа.

// `Color` это конструктор
var red = new Color(255, 0, 0);

В примере red это новый объект Color. Но как это работает?

function Color(r, g, b) {
    this.r = r;
    this.g = g;
    this.b = b;
}

var red = new Color(255, 0, 0);

Как видишь, конструктор Color берет свои аргумента и прикрепляет их к объекту this. Это из--за того, что вызов конструктора с new, устанавливает this конструктора на объект, который будет возвращен new.

Код выше грубо говоря эквивалентен этом:

var red = {
    r: 255,
    g: 0,
    b: 0
};

Тогда зачем вообще использовать конструктор? На это есть несколько важных причин.

Первое, использование конструктора означает, что создаваемые объекты будут иметь похожую базовую структуру и ты с меньшей вероятностью сделаешь ошибку, если бы вручную создавал целую кучу объектов.

Второе, использование конструктора помечает созданные объекты, как образец (instance) Color.

var red = new Color(255, 0, 0);

var blue = { r: 255, g: 0, b: 0 };

// Выведет: true
console.log(red instanceof Color);

// Выведет: false
console.log(blue instanceof Color);

Это дает нам возможность проверять, объект нужного ли типа мы обрабатываем.

Третье, использование конструктора позволяет проще связывать специальные методы с прототипом конструктора и они будут доступны для всех создаваемых с помощью это конструктора объектов.

function Color(r, g, b) {
    this.r = r;
    this.g = g;
    this.b = b;
}

Color.prototype.getAverage = function () {
    var total = this.r + this.g + this.b;
    var avg = total / 3;
    return parseInt(avg, 10);
};

var red = new Color(255, 0, 0);
var white = new Color(255, 255, 255);

// Выведет: 85
console.log(red.getAverage());

// Выведет: 255
console.log(white.getAverage());

И самое главное всегда используй new когда вызываешь конструктор. Иначе, конструктор может полностью испоганить this, который случайно оказывался при вызове. В большинстве случаев this будет указывать на глобальный объект (window в браузере или global в Node)

Поэтому принято отличать регистром имя конструктора, что бы было понятно, что его нужно использовать только вместе с new.

В следующей статье мы расскажем как снизить эту опасность при работе с конструктором.

Яндекс.Метрика