Вот задался я вопросом.
Есть некая функция f().
Я насчитал 3 возможных вызова этой функции (может еще есть?)
1) f()
2) new f()
3) f.call(obj) или f.apply(obj)
Как внутри функции узнать каким из трех вызовов воспользовались?
У меня не получилось. Пока вышло вот что:
function f() {
if(this == window) {
alert("Вызов f()");
} else if(this.constructor == arguments.callee) {
alert("Вызов new f()");
} else {
alert("Вызов f.call(obj) или f.apply(obj)");
}
}
f(); // Вызов f()
var o1 = new f(); // Вызов new f()
f.call({}); // Вызов f.call(obj) или f.apply(obj)
// Вроде как работает, однако
f.call(o1); // Вызов new f()
// Поведение абсолютно понятное, поскольку o1.constructor действительно f