1

と の 3 つのhumanメソッドwalkで名前を付けた JavaScript オブジェクトを作成しようとしeatてい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

上記のコードで何を達成しようとしているのかは明確ではありませんが、私が見る限り、2 つのオプションがあります。

A. 3 つの関数すべてを呼び出して、console.log に関数の結果を順番に出力させようとしています。つまり、(.) 操作を使用して、関数呼び出しの結果を 1 つの長い文字列に連結しています。 、この場合、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 に答える
0

そのような呼び出しをチェーンすることはできません。3 つの結果すべてをログに記録するつもりでしたか?

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

「流暢な」呼び出しチェーンが必要な場合は、関数をすべて返す必要がありますthis(その上で関数を呼び出すことができるようにするため)。

于 2013-10-08T00:30:54.297 に答える