对象方法被视为字符串

时间:2013-10-30 11:40:58

标签: javascript function object

我正在定义一个非常简单的对象,它应该计算数字1和1的总和。 2:

function Calculator() {
    this.number1 = 0;
    this.number2 = 0;
    this.sum = function() {
        return this.number1 + this.number2;
    }
}

var calculator = new Calculator();
calculator.number1 = 1;
calculator.number2 = 2;

console.log(calculator.sum);

然而,当我运行“sum”方法时,控制台返回:

function() {
        return this.number1 + this.number2;
    }

这就像我的方法被认为是一个字符串,但我不明白为什么......

2 个答案:

答案 0 :(得分:6)

你忘记给它打电话了。使用:

console.log(calculator.sum());

您的方法不被视为字符串。会发生什么是calculator.sum是一个包含函数的变量。无需调用即可记录它只会返回它的主体。

答案 1 :(得分:1)

首先,“被视为”字符串:sum被视为功能。但是,因为您试图“转储”函数引用,并且您只能转储文本,JavaScript需要询问该对象的字符串表示形式。并且该对象的字符串表示是函数的源。所以基本上有:

console.log(calculator.sum);

拥有:

是一样的
console.log(calculator.sum.toString());

那是因为log需要转储字符串并尝试将参数转换为可以显示的内容。另请注意,此行为取决于您正在使用的控制台。例如,Firefox的Web控制台返回[object Function](因为它使用Object.prototype.toString而不是函数的一个),其中Chrome Web控制台返回函数的toString方法。

在您的情况下,您可能想要调用该方法,因此您忘记了括号:

console.log(calculator.sum());

但是,原因是当您尝试在没有括号的情况下记录calculator.sum时没有出现任何错误,这是因为JavaScript有first-class function。这是一个非常强大的功能,它使您能够将函数作为其他函数的参数传递,就像您所做的那样。例如,你可以:

function log(thing) {
    console.log(Object.prototype.toString.call(thing));
}

log(1);
log("something");
log(function foo() {});

当然你也可以调用一个作为参数传递的函数:

function say(something) {
    alert(something());
}

function hello() { return "Hello!" };
function bye() { return "Bye!" };

say(hello);
say(bye);

这些只是愚蠢的例子,但只是为了给你一个想法。