0

我正在定义一个非常简单的对象,它应该计算数字 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;
    }

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

4

2 回答 2

6

You forgot to call it. Use:

console.log(calculator.sum());

Your method wasn't considered a string. What happens is that calculator.sum is a variable that holds a function. Logging it without calling will just return its body.

于 2013-10-30T11:41:38.500 回答
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 具有一流的功能。这是一个非常强大的东西,它使您能够像您一样将函数作为其他函数的参数传递。例如,您可以拥有:

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);

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

于 2013-10-30T12:05:29.163 回答