2016-08-18 1 views
1

私はこれを試してみました。私はaddArrと呼ばれるオブジェクト上に新しいメソッドを作成しようとしています。このメソッドはメソッド[1, 2, 3]を渡すことができ、各要素はメソッドが呼び出された配列に追加されます。例えばJavaScriptの配列プロトタイプ、「この」「プッシュ」を持っていない方法は

私は Uncaught TypeError: this.push is not a function取得しています
var myArr = [1, 2, 3]; 
myArr.addArr([4, 5, 6]); 
// The output is supposed to be [1, 2, 3, 4, 5, 6] 

については

は、私はこれは常に、まだ親配列を返すことはpushが関数ではないことを言って、デバッグを試してみました。

どうすれば解決できますか?私はこれらのためにLodashのようなライブラリを使うことができましたが、私はそのような小さなアプリケーションのために好むわけではありません。

ありがとうございます!

+1

「this」は各機能に固有です。 'forEach(function()...)'は 'this'のための独自の値を持つ新しい関数です... – deceze

+0

' .forEach() 'メソッドはコールバックを呼び出す際に' this'を配列に設定しません。あなたは 'arr.forEach(function(){arr}')でそうすることができます。また、コールバックが反復処理している同じ配列に新しい要素を追加することは実際には意味がありません。 – nnnnnn

+0

ああ私はとても愚かだと感じる!それに気付かなかった。大変ありがとうございます。 –

答えて

4

thisを関数外の変数に格納します。

Array.prototype.addArr = function(arr){ 
var that = this; 
arr.forEach(function(elm){ 
that.push(elm); 
}); 

    return this; 
}; 
var myArr = [1,2,3]; 
myArr.addArr([4,5]); 

代替@nnnnnnが指摘したように、あなたは.forEach関数の引数としてthisを渡すことができます。

Array.prototype.addArr = function(arr){ 
arr.forEach(function(elm){ 
this.push(elm); 
},this); 
return this; 
}; 

var myArr = [1,2,3]; 
myArr.addArr([4,5]); 
+0

@DeepakKamat大歓迎です! :-) –

+1

'arr.forEach(function(){this、this)}は新しい変数を作るよりも簡単でしょうか? (forEach()へのオプションの2番目の引数は、コールバック内の 'this'の値を指定します。) – nnnnnn

+0

@nnnnnnこれは真です。ここでのパフォーマンスのために多くのことを行うかどうかは不明ですが、もっとクリーンなソリューションと考えることができます:-)私はそれを追加するために私の答えを変更しました、ありがとう! –

関連する問題