2

Array私はプロトタイプを拡張しました:

if(typeof Array.prototype.filter === 'undefined') Array.prototype.filter = function(fun /*, thisp*/){
  var len = this.length;
  if(typeof fun != "function") throw new TypeError();

  var res = [], thisp = arguments[1];

  for(var i=0;i<len;i++){
    if(i in this){
      var val = this[i]; // in case fun mutates this
      if(fun.call(thisp, val, i, this)) res.push(val);
    }
  }

  return res;
};

たとえば、私は配列を作成しました:

var A = [ 1, 2, 3, 4, 5 ];

次に、それに追加のプロパティを追加しました。これを使用します。

A.creator = 'Rustam';
A.created = new Date();

for-inループを使用し、ブラウザにのサポートが組み込まれていない場合Array.filterは、を通過しA.filterます。

私はこのように知っています:

for(var p in A) {
  if (!A.hasOwnProperty(p)) continue
  console.log(p)
};

使用せずにA.filter隠しておく方法はありますか?for-inhasOwnProperty


答えるために更新します。ブラウザのサポート:

  • IE9 +
  • FF4 +
  • クロム
  • Opera 11.6+
  • Safari 5+
4

1 に答える 1

6

ループに表示されないプロパティを定義するには、次を使用しますObject.defineProperty

Object.defineProperty(Array.prototype, 'filter', {value:'XYZ'});

これは、を含むデフォルトのプロパティ記述子でArray.prototype呼び出されるプロパティで拡張され、プロパティがループに表示されなくなります。filterenumerable: falsefor( .. in ..)

参考文献

PS:古いブラウザでは動作しませんこのAPIのブラウザ互換性マトリックスがありません。

于 2012-07-31T11:59:18.630 に答える