Оператор new
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
Оператор (операторная функция) new
создаёт экземпляр объекта, встроенного или определённого пользователем, имеющего конструктор.
Синтаксис
new constructor[([arguments])]
Параметры
constructor
-
Функция, задающая тип объекта.
arguments
-
Список параметров, с которыми будет вызван конструктор.
Описание
Создание объекта, определённого пользователем, требует два шага:
- Написать функцию, которая задаст тип объекта.
- Создать экземпляр объекта, используя
new
.
Чтобы определить новый тип объекта, создайте функцию, которая задаст его и имя и свойства. Свойство объекта также может быть объектом. Примеры приведены ниже.
Когда исполняется new Foo(...)
, происходит следующее:
- Создаётся новый объект, наследующий
Foo.prototype.
- Вызывается конструктор — функция
Foo
с указанными аргументами иthis
, привязанным к только что созданному объекту.new Foo
эквивалентноnew Foo()
, то есть если аргументы не указаны,Foo
вызывается без аргументов. - Результатом выражения new становится объект, возвращённый конструктором. Если конструктор не возвращает объект явно, используется объект из п. 1. (Обычно конструкторы не возвращают значение, но они могут делать это, если нужно переопределить обычный процесс создания объектов.)
Всегда можно добавить свойство к уже созданному объекту. Например, car1.color = "black"
добавляет свойство color
к объекту car1
, и присваивает ему значение "black
". Это не затрагивает другие объекты. Чтобы добавить свойство ко всем объектам типа, нужно добавлять его в определение типа Car.
Добавить свойство к ранее определённому типу можно используя свойство Function.prototype
. Это определит свойство для всех объектов, созданных этой функцией, а не только у какого-либо экземпляра. Следующий пример добавляет свойство color со значением null
всем объектам типа car
, а потом меняет его на "black
" только у экземпляра car1
. Больше информации в статье prototype.
function Car() {}
car1 = new Car();
console.log(car1.color); // undefined
Car.prototype.color = null;
console.log(car1.color); // null
car1.color = "black";
console.log(car1.color); // black
Примеры
Тип объекта и экземпляры объекта
Предположим, нам нужен тип объекта для автомобилей. Этот тип должен называться car
, и иметь свойства: марка, модель и год.
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
Теперь можно создать экземпляр типа car:
var mycar = new Car("Eagle", "Talon TSi", 1993);
Это выражение создаёт экземпляр mycar
и присваивает его свойствам указанные значения. Таким образом, mycar.make
принимает значение "Eagle", mycar.year
принимает значение 1993, и так далее.
Можно создать любое количество экземпляров car
с помощью оператора new
. Например:
var kenscar = new Car("Nissan", "300ZX", 1992);
Объект в качестве свойства
Предположим, есть объект person
:
function Person(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
Создадим два экземпляра:
var rand = new Person("Rand McNally", 33, "M");
var ken = new Person("Ken Jones", 39, "M");
Изменим определение car
, добавив свойство, указывающее владельца — owner
:
function Car(make, model, year, owner) {
this.make = make;
this.model = model;
this.year = year;
this.owner = owner;
}
Создадим экземпляры car:
var car1 = new Car("Eagle", "Talon TSi", 1993, rand);
var car2 = new Car("Nissan", "300ZX", 1992, ken);
Вместо строковых или численных значений можно передать объект как параметр. Чтобы узнать имя владельца car2
, получим доступ к свойству:
car2.owner.name;
Спецификации
Specification |
---|
ECMAScript Language Specification # sec-new-operator |
Совместимость с браузерами
BCD tables only load in the browser