具有扩展原型和"for-in"循环的JavaScript本机对象

Rus*_*tam 2 javascript for-loop embedded-object

我扩展了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;
};
Run Code Online (Sandbox Code Playgroud)

例如,我创建了数组:

var A = [ 1, 2, 3, 4, 5 ];
Run Code Online (Sandbox Code Playgroud)

然后我添加了额外的属性,我将使用:

A.creator = 'Rustam';
A.created = new Date();
Run Code Online (Sandbox Code Playgroud)

如果我将使用for-in循环,并且浏览器没有内置支持Array.filter,它将通过A.filter.

我知道这样:

for(var p in A) {
  if (!A.hasOwnProperty(p)) continue
  console.log(p)
};
Run Code Online (Sandbox Code Playgroud)

有没有办法A.filter隐藏在for-in不使用hasOwnProperty


更新回答.浏览器支持:

  • IE9 +
  • FF4 +
  • Opera 11.6+
  • Safari 5+

Ash*_*bhu 5

要定义不在循环中显示的属性,请使用Object.defineProperty:

Object.defineProperty(Array.prototype, 'filter', {value:'XYZ'});
Run Code Online (Sandbox Code Playgroud)

这扩展Array.prototype了一个filter使用默认属性描述符调用的属性,包括enumerable: false,这会导致属性不显示在for( .. in ..)循环中.

参考

PS:不适用于旧浏览器我没有此API的浏览器兼容性矩阵.

  • 这是ECMAScript 5语法,因此除非您可以"填充"功能,否则将缺少浏览器支持. (3认同)