иногда мы теряем новое ключевое слово ...
Все о дисциплине кодирования и тестировании ... в любом случае, перейдем к вашему вопросу.
Чтобы узнатьесли ваша функция была вызвана как конструктор, используйте instanceof
:
function Foo() {
console.log(this instanceof Foo);
}
Foo(); // false
new Foo(); // true
При вызове функции в качестве конструктора this
относится к вновь созданному объекту, в противном случае this
ссылается на объект, которым была функциявызывается, если он не вызывался ни для чего this
будет ссылаться на глобальный объект.
Обновление
Передача аргументов переменной конструктору невозможна,new clas.call(....)
приведет к ошибке, что call
не является конструктором.
Вы можете сделать две вещи:
- Вместо возврата самой функции
Class
из фабрики классовметод, возвращает функцию, которая создает новый экземпляр, устанавливает все необходимые вещи, а затем возвращает этот экземпляр (это усложнит наследование) - Просто используйте ключевое слово
new
.
Я написал свой собственный Class thingy , и я пытался поддерживать синтаксис new
и ()
для создания экземпляров.Весь материал наследования и т. Д. Достаточно сложен, что делает его еще более волшебным только для того, чтобы сэкономить 4 больше символов ... не стоит усилий.Используйте new
и пишите тесты.
Еще одно обновление
ОК Я не удержался, чтобы взломать больше, и заставил его работать:
function is(type, obj) {
return Object.prototype.toString.call(obj).slice(8, -1) === type;
}
function clas(args) {
if (is('Object', this)) {
ctor.apply(this, is('Arguments', args) ? args : arguments);
} else {
return new clas(arguments);
}
}
Это сделает магию, по крайней мере, в моем случае.