Назад к вопросам
Middle
121
questionbank
Как работает оператор new в JavaScript?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Оператор new используется для создания экземпляра объекта на основе функции-конструктора.
При вызове new ФункцияКонструктор() происходят следующие шаги:
- Создается новый пустой объект в памяти.
- Прототип этого нового объекта устанавливается равным свойству
prototypeФункцииКонструктора. - Конструктор
ФункцияКонструкторвызывается с контекстом выполнения (this), установленным на новый объект. Аргументы, переданныеnew, передаются в конструктор. - Если конструктор возвращает не-примитивное значение (объект, массив, функция и т.д.), то это значение становится результатом вызова
new. - Если конструктор явно не возвращает значение или возвращает примитивное значение (число, строка, null, undefined, boolean, symbol, bigint), то результатом вызова
newстановится новый объект, созданный на шаге 1.
Пример:
function Person(name, age) {
// this указывает на новый объект, созданный new
this.name = name;
this.age = age;
}
Person.prototype.greet = function() {
// this все еще указывает на экземпляр объекта
console.log(`Привет, меня зовут ${this.name} и мне ${this.age} лет.`);
};
const person1 = new Person('Алексей', 30); // Вызов new
console.log(person1); // { name: 'Алексей', age: 30 }
person1.greet(); // Привет, меня зовут Алексей и мне 30 лет.
console.log(person1 instanceof Person); // true
Аналогичное поведение можно эмулировать без new с помощью Object.create и call или apply:
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.greet = function() {
console.log(`Привет, меня зовут ${this.name} и мне ${this.age} лет.`);
};
// Эмуляция new
function customNew(constructor, ...args) {
const obj = Object.create(constructor.prototype); // Шаг 1 и 2
const result = constructor.apply(obj, args); // Шаг 3
// Шаг 4 и 5
return result !== null && typeof result === 'object' ? result : obj;
}
const person2 = customNew(Person, 'Мария', 25);
console.log(person2); // { name: 'Мария', age: 25 }
person2.greet(); // Привет, меня зовут Мария и мне 25 лет.