2011-03-03 90 views
2
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 

所以,barf实例方法这是Foo一个实例。
另一方面,bazFoo的原型方法。是否可以确定实例方法是否在原型方法中调用?

我想是这样的:

bar应该返回x(传递到构造函数的参数),但只有当它是从一个原型法(的Foo.prototype的方法)中调用。因此,bar应检查当前执行上下文是否为Foo.prototype函数,并且只有bar应该返回x

在情况1中,当前执行上下文是全局代码,所以bar调用的返回值应为undefined。 (这个,我的意思是:我希望它在这种情况下返回undefined。)

但是在这种情况下,当前执行上下文是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 “直接” 称为 - >返回未定义
情况2:getX从原型方法中调用 - > return x

+0

我想你可以使用arguments.callee.caller,但它真的被弃用,不应该使用 – 2011-03-03 14:48:21

+0

为什么你需要它吗?我找不到它的有用性... – 2011-03-03 14:56:05

+0

@Martin看看我的问题中的更新。我正在将一个数字传递给'Foo'。我希望这个数字可以被原型方法所访问,但是我不希望这个数字能够在不使用原型方法的情况下被直接获取。 – 2011-03-03 15:02:56

回答

0

在情况1中,当前执行上下文是全局代码,所以返回酒吧电话的价值应该是不确定的。

您正在使用闭包,这就是getX方法访问变量x的原因。它的JavaScript表现符合预期。

+0

方法的getX是不是这里的点。如果调用者不是原型方法,我希望getX返回undefined。 – 2011-03-04 01:20:02

0

所以这是我自己的解决方案:

function Foo(x) { 
    function getX() { 
     return getX.caller === Foo.prototype.sqr ? x : void 0; 
    } 
    this.getX = getX; 
} 

Foo.prototype.sqr = function() { 
    var x = this.getX(); 
    return x * x; 
}; 

var f = new Foo(3); 
console.log(f.getX()); // logs undefined 
console.log(f.sqr()); // logs 9 

正如你所看到的,我必须定义getX作为Foo构造函数的本地函数(然后通过this.getX = getX;分配此功能的实例内getX。 ,我明确检查getX.caller是否Foo.prototype.sqr

相关问题