23

このような機能を想像してみましょう:

function foo(x) {
    x += '+';
    return x;
}

それの使用法は次のようになります:

var x, y;
x = 'Notepad';
y = foo(x);
console.log(y); // Prints 'Notepad+'.

他の関数と連鎖できる関数を作成する方法を探しています。

使用法を想像してみてください。

var x, y;
x = 'Notepad';
y = x.foo().foo().toUpperCase(); // Prints 'NOTEPAD++'.
console.log(y);

どうすればいいですか?

4

3 に答える 3

25

確かに、トリックは、オブジェクトの変更が完了したら、オブジェクトを返すことです。

String.prototype.foo = function() {
    return this + "+";
}

var str = "Notepad";
console.log(str.foo().foo().toUpperCase());

http://jsfiddle.net/Xeon06/vyFek/

メソッドをで利用できるようにするために、Stringプロトタイプを変更しています。ただし、これを行わないように注意してくださいObject。プロパティを列挙するときに問題が発生する可能性があります。

于 2011-10-11T18:00:21.613 に答える
10

私の記憶が正しければ、「this」を関数(それが属するオブジェクト)のコンテキストとして使用し、それを返して関数をチェーン可能にすることができます。言い換えると:

var obj = 
{
    f1: function() { ...do something...; return this;},
    f2: function() { ...do something...; return this;}
}

次に、次のように呼び出しを連鎖させることができますobj.f1().f2()

obj.f1()。toUpperCase()を呼び出しても期待どおりの結果が得られないことに注意してください。f1()が実行され、「this」が返され、obj.toUpperCase()が呼び出されます。

于 2011-10-11T18:00:04.480 に答える
0

String.prototypeこれは、追加のメソッドを使用して、文字列に似たオブジェクトを返すことにより、を台無しにすることなくそれを行う方法foo()です。ただし、実際の文字列を返さないことに関連して、このアプローチにはいくつかの欠点があります。

// Returns an object similar to a string, with an additional method foo()
function foo(str) {
  return Object.assign(`${str ?? this}+`, {
    foo
  });
}

var str = "Notepad";
console.log(
  "EXAMPLE - foo(str).foo().toUpperCase():",  
  foo(str).foo().toUpperCase()
);

console.log("---");

console.log("Some issues with this solution:");
console.log("typeof foo(str):", typeof foo(str));
console.log("foo(str).foo():", foo(str).foo());

console.log(
  "You may need to use toString() - foo(str).foo().toString():",
  foo(str).foo().toString()
);
.as-console-wrapper { min-height: 100% }

于 2021-06-16T19:44:16.593 に答える