Конструкторы объектов JavaScript

Пример:


function Person(first, last, age, eye) {
    this.firstName = first;
    this.lastName = last;
    this.age = age;
    this.eyeColor = eye;
} 

Считается хорошей практикой программирования, чтобы название функции конструкторов начиналось с большой буквы.

Объектные типы (Шаблоны) (Классы)

Примеры из предыдущих глав значительно ограничены. В них создается только одиночные объекты.

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

Для создания "объектного типа" и используется функция конструктора объекта.

В приведенном в начале этой главы примере функция Person() является функцией конструктора объекта.

Объекты одного и того же типа создаются при помощи вызова функции конструктора с ключевым словом new:


var myFather = new Person("John", "Doe", 50, "blue");
var myMother = new Person("Sally", "Rally", 48, "green"); 

Ключевое слово this

В JavaScript ключевое слово this обозначает объект, которому "принадлежит" данный код.

Значением ключевого слова this, когда оно используется в объекте, является сам объект.

В функции конструктора у ключевого слова this нет значения. Это "подстановка" для нового объекта. Когда будет создан новый объект, тогда значением ключевого слова this и станет этот новый объект.

Обратите внимание, что this это не переменная, а ключевое слово. Вы не можете изменять его значение.

Добавление свойства к объекту

Добавить новое свойство к существующему объекту очень просто:


myFather.nationality = "English"; 

Свойство будет добавлено к объекту myFather, но не к объекту myMother. (Или какому-либо другому объекту типа person).

Добавление метода к объекту

Добавить новый метод к существующему объекту очень просто:


myFather.name = function () {
    return this.firstName + " " + this.lastName;
}; 

Метод будет добавлен к объекту myFather, но не к объекту myMother. (Или какому-либо другому объекту типа person).

Добавление свойства к конструктору объекта

Нельзя добавлять новое свойство к конструктору объекта тем же способом, как это делается в случае с существующим объектом.

Чтобы добавить новое свойство к конструктору, вы должны добавить его в функцию конструктора:


function Person(first, last, age, eyecolor) {
    this.firstName = first;
    this.lastName = last;
    this.age = age;
    this.eyeColor = eyecolor;
    this.nationality = "English";
} 

При этом свойствам объекта можно устанавливать значения по умолчанию.

Добавление метода к конструктору объекта

Функция конструктора также может определять методы:


function Person(first, last, age, eyecolor) {
    this.firstName = first;
    this.lastName = last;
    this.age = age;
    this.eyeColor = eyecolor;
    this.name = function() {return this.firstName + " " + this.lastName;};
} 

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


function Person(firstName, lastName, age, eyeColor) {
    this.firstName = firstName;  
    this.lastName = lastName;
    this.age = age;
    this.eyeColor = eyeColor;
    this.changeName = function (name) {
        this.lastName = name;
    };
} 

Функция changeName() присваивает значение параметра name свойству lastName объекта person:


myMother.changeName("Doe"); 

JavaScript знает, о каком объекте идет речь, "подставляя" в ключевое слово this объект myMother.

Встроенные конструкторы JavaScript

В JavaScript есть встроенные конструкторы для собственных объектов:


var x1 = new Object();    // Новый объект Object
var x2 = new String();    // Новый объект String
var x3 = new Number();    // Новый объект Number
var x4 = new Boolean();   // Новый объект Boolean
var x5 = new Array();     // Новый объект Array
var x6 = new RegExp();    // Новый объект RegExp
var x7 = new Function();  // Новый объект Function
var x8 = new Date();      // Новый объект Date 

В этом списке нет объекта Math(), так как это глобальный объект. Ключевое слово new нельзя использовать с объектом Math.

А вы знали?

Как видно из приведенного выше кода, в JavaScript есть объектные версии примитивных типов данных String, Number и Boolean. Однако нет никаких причин создавать для этих типов комплексные объекты. Примитивные значения работают быстрее.

Таким образом:

  • используйте объектные литералы { } вместо new Object().
  • используйте строковые литералы "" вместо new String().
  • используйте числовые литералы 12345 вместо new Number().
  • используйте логические литералы true / false вместо new Boolean().
  • используйте литералы-массивы [ ] вместо new Array().
  • используйте литералы-шаблоны /()/ вместо new RexExp().
  • используйте выражения функций () {} вместо new Function().


var x1 = {};            // новый объект Object
var x2 = "";            // новая примитивная строка
var x3 = 0;             // новое примитивное число
var x4 = false;         // новое примитивное логическое значение
var x5 = [];            // новый объект Array
var x6 = /()/           // новый объект RegExp
var x7 = function(){};  // новый объект Function