Как создать функцию, которую нельзя использовать в качестве конструктора

Я пытаюсь создать функцию в javascript, которую нельзя вызвать как конструктор, например, скажем, если функция function SomeFunction(){}, при вызове ее как new SomeFunction() она должна вызывать исключение, но ее вызов без new должен работать.

Есть ли способ добиться этого?

почему ты хочешь сделать это?

adiga 09.04.2019 08:19

Мне любопытно понять, есть ли способ узнать внутри функции, вызывается ли она с помощью new или нет.

Gautam 09.04.2019 08:20

пожалуйста, покажите функцию

brk 09.04.2019 08:20

Да, это возможно, но, похоже, это проблема XY. Какую настоящую проблему вы хотите решить?

VLAZ 09.04.2019 08:20
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
71
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Используйте new.target. Это специальное свойство, которое устанавливается при вызове функции как конструктора. См. следующий пример.

function test() {
  if (new.target) {
    throw new Error('Can not call as constructor');
  }
  
  return 'test';
}

console.info(test());
console.info(new test());
Ответ принят как подходящий

Вы также можете использовать для этого функцию стрелки es6 =>, так как они не разрешены в качестве функций-конструкторов.

let SomeFunction = ()=>{ console.info("called");}
SomeFunction();
//Error for arrow function
new SomeFunction();

Вызов конструктора создает экземпляр, поэтому вы можете проверить, не создан ли экземпляр.

function SomeFunction () {
	if (this instanceof SomeFunction)
		throw('constructor called');
	console.info('function called')
}

SomeFunction();

new SomeFunction()

Другие вопросы по теме