new
Базовый уровень Широко доступен
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в версиях браузеров. Она доступна в браузерах с июля 2015 года.
Оператор new позволяет разработчикам создавать экземпляр пользовательского типа объекта или одного из встроенных типов объектов, имеющих конструктор.
Попробуйте
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
const car1 = new Car("Eagle", "Talon TSi", 1993);
console.log(car1.make);
// Expected output: "Eagle"
Синтаксис
new constructor new constructor() new constructor(arg1) new constructor(arg1, arg2) new constructor(arg1, arg2, /* …, */ argN)
Параметры
-
constructor - Класс или функция, определяющая тип экземпляра объекта. Выражение может быть чем угодно с достаточным приоритетом, включая идентификатор, доступ к свойству или другое выражение
new, но опциональная цепочка не разрешена. -
arg1,arg2, …,argN - Список значений, с которыми будет вызван
constructor.new Fooэквивалентенnew Foo(), то есть, если список аргументов не указан,Fooвызывается без аргументов.
Описание
Когда функция вызывается с ключевым словом new, функция используется как конструктор. new выполнит следующие действия:
- Создает пустой, обычный объект JavaScript. Для удобства назовем его
newInstance. -
Привязывает [[Prototype]] объекта
newInstanceк свойствуprototypeконструкторской функции, еслиprototypeявляетсяObject. В противном случаеnewInstanceостанется обычным объектом сObject.prototypeв качестве его [[Prototype]].Примечание: Свойства/объекты, добавленные к свойству
prototypeконструкторской функции, поэтому доступны всем экземплярам, созданным из конструкторской функции. - Выполняет конструкторскую функцию с заданными аргументами, привязывая
newInstanceв качестве контекстаthis(т.е. все ссылки наthisв конструкторской функции теперь ссылаются наnewInstance). - Если конструкторская функция возвращает не примитивное значение, это возвращаемое значение становится результатом всего выражения
new. В противном случае, если конструкторская функция ничего не возвращает или возвращает примитив, вместо этого возвращаетсяnewInstance. (Обычно конструкторы не возвращают значение, но они могут выбрать это, чтобы переопределить обычный процесс создания объекта.)
Классы могут быть инстанциированы только с оператором new — попытка вызвать класс без new приведет к ошибке TypeError.
Создание объекта с пользовательской конструкторской функцией требует двух шагов:
-
Определите тип объекта, написав функцию, которая определяет его имя и свойства. Например, конструкторская функция для создания объекта
Fooможет выглядеть так:function Foo(bar1, bar2) { this.bar1 = bar1; this.bar2 = bar2; } -
Создайте экземпляр объекта с помощью
new.const myFoo = new Foo("Bar 1", 2021);
Примечание: Объект может иметь свойство, которое само по себе является другим объектом. См. примеры ниже.
Вы всегда можете добавить свойство к ранее определенному экземпляру объекта. Например, оператор car1.color = "black" добавляет свойство color к car1 и присваивает ему значение "black".
Однако это не влияет на другие объекты. Чтобы добавить новое свойство ко всем объектам одного типа, вы должны добавить свойство к свойству prototype конструктора. Это определяет свойство, общее для всех объектов, созданных этой функцией, а не только для одного экземпляра типа объекта. Следующий код добавляет свойство color со значением "original color" ко всем объектам типа Car, а затем перезаписывает это значение строкой "black" только в объекте экземпляра car1. Дополнительную информацию см. в разделе prototype.
function Car() {}
const car1 = new Car();
const 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(Object.getPrototypeOf(car1).color); // 'original color'
console.log(Object.getPrototypeOf(car2).color); // 'original color'
console.log(car1.color); // 'black'
console.log(car2.color); // 'original color'
Примечание: Хотя конструкторская функция может быть вызвана как любая обычная функция (т.е. без оператора new), в этом случае новый объект не создается, и значение this также отличается.
Функция может узнать, была ли она вызвана с new, проверив new.target. new.target является undefined только при вызове функции без new. Например, вы можете создать функцию, которая ведет себя по-разному при вызове и при конструировании:
function Car(color) {
if (!new.target) {
// Called as function.
return `${color} car`;
}
// Called with new.
this.color = color;
}
const a = Car("red"); // a is "red car"
const b = new Car("red"); // b is `Car { color: "red" }`
До ES6, который ввел классы, большинство встроенных объектов JavaScript были как вызываемыми, так и конструируемыми, хотя многие из них проявляли различное поведение. Кратко:
-
Array(),Error()иFunction()ведут себя одинаково при вызове как функция или как конструктор. -
Boolean(),Number()иString()при вызове преобразуют свой аргумент в соответствующий примитивный тип и возвращают обертывающие объекты при конструировании. -
Date()при вызове возвращает строку, представляющую текущую дату, эквивалентнуюnew Date().toString().
После ES6 язык стал строже в отношении того, что является конструктором, а что — функцией. Например:
-
Symbol()иBigInt()можно вызывать только безnew. Попытка их конструирования приведет к ошибкеTypeError. -
ProxyиMapможно конструировать только с помощьюnew. Попытка их вызова приведет к ошибкеTypeError.
Примеры
Тип объекта и экземпляр объекта
Предположим, вы хотите создать тип объекта для автомобилей. Вы хотите, чтобы этот тип объекта назывался Car, и чтобы он имел свойства make, model и year. Для этого вы бы написали следующую функцию:
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
Теперь вы можете создать объект под названием myCar следующим образом:
const myCar = new Car("Eagle", "Talon TSi", 1993);
Этот оператор создает myCar и присваивает ему указанные значения для его свойств. Затем значение myCar.make — это строка "Eagle", myCar.year — целое число 1993 и так далее.
Вы можете создать любое количество объектов car путем вызовов new. Например:
const kensCar = new Car("Nissan", "300ZX", 1992);
Свойство объекта, которое само по себе является другим объектом
Предположим, вы определяете объект под названием Person следующим образом:
function Person(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
А затем создаете два новых объекта Person следующим образом:
const rand = new Person("Rand McNally", 33, "M");
const 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;
}
Чтобы создать новые объекты, вы затем используете следующее:
const car1 = new Car("Eagle", "Talon TSi", 1993, rand);
const car2 = new Car("Nissan", "300ZX", 1992, ken);
Вместо передачи литеральной строки или целочисленного значения при создании новых объектов, вышеприведенные операторы передают объекты rand и ken в качестве параметров для владельцев. Чтобы узнать имя владельца car2, вы можете получить доступ к следующему свойству:
car2.owner.name;
Использование new с классами
class Person {
constructor(name) {
this.name = name;
}
greet() {
console.log(`Hello, my name is ${this.name}`);
}
}
const p = new Person("Caroline");
p.greet(); // Hello, my name is Caroline
Спецификации
Совместимость с браузерами
| Настольные | Мобильные | Сервер | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
new |
1 |
12 |
1 |
3 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
См. также
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new