Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查是否在JavaScript中访问了类变量_Javascript_Html_Class_Variables_Web - Fatal编程技术网

检查是否在JavaScript中访问了类变量

检查是否在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); } 所以 应提醒“空

如何检查JavaScript中是否正在访问“class”变量

例如:

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'