function Foo(x) {
this.bar = function() { return x; /* but not always */ }
}
Foo.prototype.baz = function() {
return this.bar(); // Case 2 - should return x
};
var f = new Foo(3);
f.bar(); // Case 1 - should return undefined
f.baz(); // should return x which is 3 in this case
Итак, bar
является методом экземпляра f
, который является экземпляром Foo
.
С другой стороны, baz
является методом-прототипом Foo
.
То, что я хотел бы, это:
bar
должен возвращать x
(аргумент, переданный в функцию конструктора), но только если он вызывается из метода прототипа (метод Foo.prototype
).Таким образом, bar
должен проверить, является ли текущий контекст выполнения функцией Foo.prototype
, и только тогда bar
должен вернуть x
.
В случае 1 текущий контекст выполнения является глобальным кодом, поэтомувозвращаемое значение вызова bar
должно быть undefined
.(Под этим я подразумеваю: я хочу, чтобы в этом случае он возвращал undefined.)
Однако в этом случае 2 текущим контекстом выполнения является код функции функции Foo.prototype
, поэтому возвращаемое значениеbar
звонок должен быть x
.
Можно ли это сделать?
Обновление: Реальный пример:
function Foo(x) {
this.getX = function() { return x; /* but not always */ }
}
Foo.prototype.sqr = function() {
var x = this.getX(); // should return 3 (Case 2)
return x * x;
};
var f = new Foo(3);
f.getX(); // should return undefined (Case 1)
f.sqr(); // should return 9
Случай 1: getX
isВызов "напрямую" -> возврат не определен
Случай 2: getX
вызывается из метода-прототипа -> возврат х