0

更新:forEachメソッドの既存の実装があることを知っています。これを行う目的は、私のJavascriptスキルを学び、向上させることです。

配列オブジェクトにforEachメソッドを実装しようとしています。私がしていることは次のとおりです。

var list = ['one', 'two', 'three'];

function forEach(callback){
    for(var n = 0; n < this.length; n++){
        callback.call(this[n], n);
    }
};

list.forEach(function(index){
        console.log(index);
        console.log(this);
    }
);

私はjavascriptがあまり得意ではなく、改善しようとしているので少し読んでいますが、この種のことを行うと、「forEach」関数のコンテキストがオブジェクトになることがわかりました。これを「リスト」と呼びます。

このコードを実行すると、「Uncaught TypeError:Object one、two、three has nomethod'forEach'」というエラーが発生します。

何がわからないの?

ありがとう!

4

5 に答える 5

1
var list = ['one', 'two', 'three'];

list.forEach = function(callback){
    for(var n = 0; n < this.length; n++){
        callback.call(this[n], n);
    }
};

list.forEach(function(index){
        console.log(index);
        console.log(this);
    }
);​

そのリストオブジェクトで独自のものを作成しようとしているようです。もしそうなら、それをそのオブジェクトのプロパティにする必要があります。

于 2012-08-06T20:54:19.570 に答える
0

配列をインスタンス化する前に、forEachを定義する必要があると思います。

Array.prototype.forEach = function (callback) {
    var n;
    for(n = 0; n < this.length; n++){
        callback.call(this[n], n);
    }
};
于 2012-08-06T20:59:44.243 に答える
0

おそらく、foreach関数をここにある1つの配列だけにアタッチするのではなく、すべての配列で機能させることをお勧めします。これを行うには、配列プロトタイプを編集する必要があります(将来の名前空間の衝突の可能性から保護できないため、非常に強い意見を持っている人もいますが、他の人は非常に便利です)。オブジェクトにArray.prototype関数が追加されると、任意の配列でその関数を呼び出すことができます。このような:

var list = ['one', 'two', 'three'];

Array.prototype.myForEach = function(callback){
    for(var n = 0; n < this.length; n++){
        callback.call(this[n], n);
    }
};

list.myForEach(function(index){
    console.log(index);
    console.log(this);
});

*既存のforEach関数との競合を避けるための注意myForEach(https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach)競合から安全であると期待する関数に名前を付けました。

于 2012-08-06T21:01:18.110 に答える
0

配列のプロトタイプにforEachメソッドを追加する必要があります。

/*
* pay attention to the fact that if you use forEach aas method name you'll override
* the built default forEach method, try to use some prefix to distinguish between
* the built in methods and your own ones 
*/
Array.prototype.my_forEach = function(callback){ /* your code here */ };
于 2012-08-06T21:02:34.963 に答える
0

次を使用して、コンテキスト オブジェクト (thisキーワード) を設定できcallます。

myForEach.call(list, function(index) { … });

別の可能性は、リスト オブジェクトのプロパティとして関数を呼び出すことです。

list.myForEach = function(callback) { … };
list.myForEach(function(index) { … });

または、すべてのArrayオブジェクトのプロトタイプに追加してこれを有効にします。

Array.prototype.myForEach = function(callback) { … };
['one', 'two', 'three'].myForEach(function(index) { … });

注:配列には既にforEachメソッドが存在するはずです。そこから互換性シムを使用して、古代のブラウザーでまったく同じ機能を提供します。

于 2012-08-06T20:57:41.807 に答える