1

我正在尝试创建一个human以三个方法命名的 JavaScript 对象walkeat并且talk我想这样调用它(没有方法应该打印任何值human.talk('hello').walk('home').eat('pizza'):。

我有这个代码:

var human = {
    talk : function talk(t){

    },
    walk : function walk(w){

    },
    eat : function eat(e){

    }
};

console.log(human.talk('hello').walk('home').eat('pizza'));

但我收到Uncaught TypeError: Cannot call method 'walk' of undefined

为什么??

4

3 回答 3

6

return this如果您希望能够链接功能,则每个功能都需要。您收到错误是因为函数talk正在返回undefined并且您实际上是在尝试调用undefined.walk('home').

于 2013-10-08T00:31:06.930 回答
0

你不能像这样链接调用。您是要记录所有三个结果吗?

console.log(human.talk('hello'),human.walk('home'),human.eat('pizza'));

如果您确实想要一个“流畅”的调用链,那么您的函数都需要返回this(以便您可以继续在其上调用函数)。

于 2013-10-08T00:30:54.297 回答
0

它不完全清楚你想用上面的代码实现什么,但据我所知,有两个选择:

A. 您尝试调用所有三个函数并让 console.log 依次打印函数的结果,一个接一个,即您正在使用 (.) 操作将函数调用的结果连接成一个长字符串,在这种情况下,我想提醒您,javascript 中的连接运算符与说 php 是 + 而不是 (.) 不同,所以宁愿使用这个:

console.log(human.talk('hello') + walk('home') + eat('pizza'));

B. 你实际上想为函数调用调用一个链。在这种情况下,我想让你保持那个 . 运算符检索对象的属性或方法,即语法为 (object).(property),始终是运算符之前的标识符或值应该是对象。所以,为了让你的链调用工作,你所有给定的函数都应该返回一个对象,(好吧,也许除了最后一个)在这种情况下,适当的返回值将是“this”:

var human = {
    talk : function(t){
       return this;

    },
    walk : function(w){
       return this;
    },
    eat : function(e){
       return this;//or whatever here
    }
};
于 2013-10-08T01:09:15.180 回答