0

配列機能を自分の機能で拡張したいのですが。これは正常に機能しています。ただし、コンソールでは、関数がデータであるかのように配列に「追加」されていることに気付きました。

フィドル: http: //jsfiddle.net/BxfCy/1/

そして、stackoverflowが私に投稿を強制しているので、ここにコードがあります(フィドルをクリックするだけです):

a = [1,2,3];

Array.prototype.doMagic = function(){
    var returnvar = this;
    returnvar.push(42);
    return returnvar;
}

console.log(a);

for (var n in a){
    console.log(a[n]);
}

私の考えでは、他の配列関数は配列に表示されません(プッシュのように)。プロトタイプ化された関数を配列に表示しない方法はありますか?

4

2 に答える 2

5

1つの方法は使用することObject.hasOwnProperty()です:

for (var n in a){
    if (a.hasOwnProperty(n)) {
        console.log(a[n]);
    }
}

より良い方法は、配列に適切な反復イディオムを使用することです。

for (var i=0; i<a.length; i++){
    console.log(a[i]);
}

またはObject.definePropertydoMagicプロパティを列挙できないようにするために使用します。

Object.defineProperty(Array.prototype, 'doMagic', {
    enumerable: false,
    configurable: false,
    writable: false,
    value: function(){
        var returnvar = this;
        returnvar.push(42);
        return returnvar;
    }
});
于 2013-02-21T01:18:35.267 に答える
4

問題はfor..in、通常のループを使用する必要があるときに、ループに使用していることですfor

for (var i=0; i<a.length; i++){
  console.log(a[i]);
}

for..in配列ではなくオブジェクトを対象としています。

編集:最新のブラウザでは、次forEachのものも使用できます。

a.forEach(function(val, i) {
  ...
});
于 2013-02-21T01:18:13.810 に答える