Создание объектов через оператор «new»

Создание объектов через оператор «new»

Здравствуйте!  До этого  мы с вами рассматривали  синтаксис, который использует фигурные скобки  при создании объекта, но такой способ позволяет создать лишь один объект. Но зачастую нужно создать  очень много однотипных объектов.

Для этого используют так называемые  «функции-конструкторы», запуская их при помощи специального оператора new.

создание объектов через оператор new

Конструктор new.

Конструктором может  становится любая функция, вызванная через new.
Например:

function Mammal(name) {
  this.name = name;
  this.walk = true;
}
var mammal = new Mammal("ёж");

Следует отметить что в роли конструктора может выступать любая функция
Но для того чтобы как то выделить такую функцию ее как правило пишут с большой буквы например Mammal.
Давайте разберем, что делает функция-конструктор:

  1. Создает новый пустой объект.
  2. Ключевое слово this получит ссылку на этот объект.
  3. Функция выполнится. Она модифицирует this , добавляет методы, свойства.
  4. Возвращается указатель this.

В итоге после  вызова  new Mammal(«ёж»); получим  вот такой объект:

mammal = {
  name: "ёж",
  walk: true
}

Иными словами, при вызове new Mammal происходит вот что:

function Mammal(name) {
  // this = {};
  // в this пишем свойства, методы
  this.name = name;
  this.walk = true;
  //return this;
}

Теперь многократными вызовами new Mammal с различными параметрами вы можете создавать столько объектов, сколько вам нужно. Отсюда и название такой функции — конструктор объектов.

new function() { … }

Функцию-конструктор можно объявить и тут же использовать, вот например:

var mammal = new function() {
  this.name = "Вася";
  this.цalk = true;
};

Но вот обычный синтаксис через фигурные скобки не подходит, когда при создании свойств объекта вам нужны более сложные вычисления. Их можно сделать в функции-конструкторе и записать результат в указатель this.

Правила обработки return

Конструкторы ничего не возвращают у них другая задача записать все что нужно и создать указатель this.
Но если все же есть явный вызов return то действуют следующие правила:

  • При вызове return с объектом, будет возвращён он, а не this.
  • При вызове return с переменной, оно будет отброшено.
Читайте также  Перебор свойств в объектах

Другими словами, вызов return с объектом вернёт сам объект, а с со всем другим кроме объекта – возвратит, как обычно, указатель this.
Вот пример возврат объекта:

function BigMammal() {
  this.name = "Мышь";
  return { name: "Годзилла" };  //возвратим объект
}
alert( new BigMammal().name );  // Годзилла, получили объект вместо this

Создание методов в конструкторе

Применение функций для создания конструкторов дает огромные преимущества в плане дополнения различных параметров. Добавим в наш конструктор новые методы.
Например, new Human(name) создает объект с заданным значением свойства name и методом say:

function Human(name) {
  this.name = name;
  this.say = function() {
    alert( "Моё имя: " + this.name );
  };
}
var vasya = new Human("Иван");
ivan.say(); // Моё имя: Иван
/*
ivan = {
   name: "Иван",
   say: функция
}
*/

Итоги.

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

В функцию-конструктор можно передавать параметр.

Задания

Две функции один объект

Возможны ли такие функции A и B в примере ниже, что соответствующие объекты a,b равны ?

function A() { ... }
function B() { ... }
var a = new A;
var b = new B;
alert( a == b ); // true

Если да – приведите пример кода с такими функциями.

Создать калькулятор при помощи конструктора

Напишите функцию-конструктор Calc, которая создает объект с тремя свойствами:

  • Метод read() запрашивает два значения при помощи prompt и запоминает их в свойствах объекта.
  • Метод summa() возвращает сумму свойств.
  • Метод mult() возвращает произведение свойств.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Плюсануть
Поделиться

Об авторе

admin administrator

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: