检查是否在JavaScript中访问了类变量
如何检查JavaScript中是否正在访问“class”变量 例如:检查是否在JavaScript中访问了类变量,javascript,html,class,variables,web,Javascript,Html,Class,Variables,Web,如何检查JavaScript中是否正在访问“class”变量 例如: function Class(){ this.string = "foo"; this.saySomething = saySomething; if(/*not accessing saySomething*/){ return "empty"; } } function saySomething(){ alert(this.string); } 所以 应提醒“空
function Class(){
this.string = "foo";
this.saySomething = saySomething;
if(/*not accessing saySomething*/){
return "empty";
}
}
function saySomething(){
alert(this.string);
}
所以
应提醒“空”和
应该输出“foo”
所以
alert(Class())代码>
应提醒“空”和
alert(Class().saySomething())
应该输出“foo”
你不能(合理地)这样做,因为Class().saySomething()
中发生的事情是调用Class()
并返回一些内容,然后我们(尝试)调用saySomething()
。Class
中的代码无法知道它是作为整个表达式的一部分调用的。它只知道它正在被调用,它不知道调用它的代码将如何处理它的返回值
当然,你可以通过传递一个论点来说明这一点,但我怀疑,如果你提出一个新问题,描述你试图实现的更广泛的目标,我们可以帮助你实现它。让类
根据调用它的表达式的类型更改它返回的内容并不是一个好的解决方案。实现这一点的唯一方法是使用toString
然后调用它,例如
function Class() {
this.string = 'foo';
}
Class.prototype.saySomething = function () {
return this.string;
};
Class.prototype.toString = function () {
return 'empty';
};
// and use
var c = new Class();
c + ''; // 'empty', or
alert(c); // 'empty'
c.saySomething(); // 'foo'
“访问”是什么意思?我想检查是调用Class().saySomething()还是只调用Class()。@user3289949 JavaScript(大部分)是同步的Class().saySomething()
表示调用Class
,然后在调用完成后,调用return
ed对象的saySomething
属性。两者并不是“同时”发生的。当saySomething()没有被调用时,函数应该返回一个字符串而不是nothing。。你想知道Class
是否被链接?你可能想要.toString而不是.valueOf但这听起来像是我想要的。@BenjaminGruenbaum也许,但我想,为什么不同时使用这两个呢?这仍然不能满足OP的要求,尽管你可以做类似的事情。(因为您已经添加了new
和一个原型。)@PaulS.:或者让它首先返回一个对象。@PaulS。请参考有关valueOf和toString之间差异的规范。主要是这个缩写-valueOf用于数字转换,toString用于字符串转换。谢谢!我希望有办法,但似乎没有。@user3289949确实有办法,你只需要覆盖。toString
@BenjaminGruenbaum:这就是为什么我说(合理地)
。改变方法几乎肯定是更好的方法。我不能不同意这一点。OP所做的听起来不合理。
alert(Class().saySomething())
function Class() {
this.string = 'foo';
}
Class.prototype.saySomething = function () {
return this.string;
};
Class.prototype.toString = function () {
return 'empty';
};
// and use
var c = new Class();
c + ''; // 'empty', or
alert(c); // 'empty'
c.saySomething(); // 'foo'