оператор new

Оператор new дозволяє створювати екземпляр типу об'єкта, що визначається користувачем або один із вбудованих типів об'єкта, що містять функцію-конструктор. Ключове слово new робить наступне:

  1. Створює пустий JavaScript об'єкт;
  2. Прив'язує об'єкт до іншого об'єкта (встановлює конструктор);
  3. Передає створений об'єкт з кроку 1 в якості контекств this;
  4. Вертає  this, якщо функція не вертає інший власний об'єкт. 

Синтаксис

new constructor[([arguments])]

Параметри

constructor
Клас чи функція, що визначає тип екземпляру об'єкта (object instance).
arguments
Список значень, з якими викликається constructor.

Опис

Creating a user-defined object requires two steps:

  1. Define the object type by writing a function.
  2. Create an instance of the object with new.

To define an object type, create a function for the object type that specifies its name and properties. An object can have a property that is itself another object. See the examples below.

When the code new Foo(...) is executed, the following things happen:

  1. A new object is created, inheriting from Foo.prototype.
  2. The constructor function Foo is called with the specified arguments, and with this bound to the newly created object. new Foo is equivalent to new Foo(), i.e. if no argument list is specified, Foo is called without arguments.
  3. The object (not null, false, 3.1415 or other primitive types) returned by the constructor function becomes the result of the whole new expression. If the constructor function doesn't explicitly return an object, the object created in step 1 is used instead. (Normally constructors don't return a value, but they can choose to do so if they want to override the normal object creation process.)

You can always add a property to a previously defined object. For example, the statement car1.color = "black" adds a property color to car1, and assigns it a value of "black". However, this does not affect any other objects. To add the new property to all objects of the same type, you must add the property to the definition of the Car object type.

You can add a shared property to a previously defined object type by using the Function.prototype property. This defines a property that is shared by all objects created with that function, rather than by just one instance of the object type. The following code adds a color property with value "original color" to all objects of type Car, and then overwrites that value with the string "black" only in the instance object car1. For more information, see prototype.

function Car() {}
car1 = new Car();
car2 = new Car();
 
console.log(car1.color);    // undefined
 
Car.prototype.color = "original color";
console.log(car1.color);    // original color
 
car1.color = 'black';
console.log(car1.color);   // black

console.log(car1.__proto__.color) //original color
console.log(car2.__proto__.color) //original color
console.log(car1.color)  // black
console.log(car2.color) // original color

If you didn't write the new operator, the Constructor Function would be invoked like any Regular Function, without creating an Object. In this case, the value of this is also different.

Приклади

Object type та object instance

Уявіть, що вам потрібно створити тип об'єкта для машин. Нехай тип об'єкта називатиметься Car і міститиме властивості для марки, моделі та року випуску. 
В результаті, ваша функція буде виглядати отак:

function Car(make, model, year) {
  this.make = make;
  this.model = model;
  this.year = year;
}

Далі ми можемо створити об'єкт під назвою mycar:

var mycar = new Car('Eagle', 'Talon TSi', 1993);

Ця інструкція створює об'єкт mycar і присвоює його властивостям значення, що були визначені раніше. В результаті значенням mycar.make буде строка "Eagle", mycar.year - ціле число 1993 тощо.

Викликаючи new, можна створити необмежене число об'єктів типу car. Наприклад:

var kenscar = new Car('Nissan', '300ZX', 1992);

Властивості об'єкта, що є іншим об'єктом

Нехай в нас є об'єкт Person, створений наступним чином:

function Person(name, age, sex) {
  this.name = name;
  this.age = age;
  this.sex = sex;
}

Інстанціюємо два нових об'єкти типу Person:

var rand = new Person('Rand McNally', 33, 'M');
var ken = new Person('Ken Jones', 39, 'M');

Далі можна доповнити визначення Car і включити в нього властивість owner. Ця властивість буде приймати об'єкт Person, як в прикладі нижче:

function Car(make, model, year, owner) {
  this.make = make;
  this.model = model;
  this.year = year;
  this.owner = owner;
}

Нові об'єкти можна інстаціювати отак:

var car1 = new Car('Eagle', 'Talon TSi', 1993, rand);
var car2 = new Car('Nissan', '300ZX', 1992, ken);

Замість того, щоб передавати літерал об'єкта чи число при створенні нових об'єктів, ці інструкції передають об'єкти rand та ken в якості параметрів для означення власників.

Дізнатись ім'я власника car2 можна таким чином:

car2.owner.name

Специфікації

Specification Status Comment
ECMAScript Latest Draft (ECMA-262)
The definition of 'The new Operator' in that specification.
Draft
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'The new Operator' in that specification.
Standard
ECMAScript 5.1 (ECMA-262)
The definition of 'The new Operator' in that specification.
Standard
ECMAScript 3rd Edition (ECMA-262)
The definition of 'The new Operator' in that specification.
Standard
ECMAScript 1st Edition (ECMA-262)
The definition of 'The new Operator' in that specification.
Standard Initial definition. Implemented in JavaScript 1.0.

Сумісність з браузерами

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
newChrome Full support YesEdge Full support 12Firefox Full support 1IE Full support YesOpera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes

Legend

Full support  
Full support

Також див.