Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript custom Array.prototype干扰for in循环_Javascript - Fatal编程技术网

Javascript custom Array.prototype干扰for in循环

Javascript custom Array.prototype干扰for in循环,javascript,Javascript,我试图用一个函数扩展Javascript的对象类型,该函数检索属于该对象的所有属性名(基本上就像PHP的array\u keys()函数对关联数组所做的那样) 当变量b发出警报时,我希望看到[“a”、“b”、“c”、“d”],而不是看到[“a”、“b”、“c”、“d”、“keys”] for in循环似乎包括原型化的keys()函数 在仍然原型化的情况下,是否有可能避免这种行为,或者我应该一起避免原型化?啊,扩展内置的乐趣for..in检查被迭代对象的整个原型链 你需要的(我相信这是事实上的现在

我试图用一个函数扩展Javascript的对象类型,该函数检索属于该对象的所有属性名(基本上就像PHP的
array\u keys()
函数对关联数组所做的那样)

当变量
b
发出警报时,我希望看到
[“a”、“b”、“c”、“d”]
,而不是看到
[“a”、“b”、“c”、“d”、“keys”]

for in循环似乎包括原型化的
keys()
函数


在仍然原型化的情况下,是否有可能避免这种行为,或者我应该一起避免原型化?

啊,扩展内置的乐趣
for..in
检查被迭代对象的整个原型链

你需要的(我相信这是事实上的现在)是检查你的循环:

for (var property in this) {
    if (this.hasOwnProperty(property)) {
        a.push(property);
    }
}

hasOwnProperty
确保您只获取直接在对象上定义的属性(即,不在原型链上)。

对于大多数情况,您应该避免扩展本机
对象。原型
。扩展时,所有对象都将接收这些新属性

Object.defineProperty(Array.prototype, 'foo', {
  value: 'bar',
  enumerable: false // Defaults to false.
});

const arr = [1,2,3];
for(const k in arr) console.log(k); // 0, 1, 2
console.log(arr.foo); // bar
在对象属性上循环是一项非常常见的任务,正如您所指出的,您遇到了意外的行为

我没有见过很多人总是在他们的代码中使用
hasOwnProperty
功能,我想说的是,在“受控环境”下,作为一个项目的独立开发人员,你可以管理这些问题,但是当事情变得更大,你有更多的开发人员参与时,这可能会导致很多问题

在对象上创建一个静态函数怎么样

Object.keys = function(obj) {
  var a = [];
  for (var property in obj) {
    if (obj.hasOwnProperty(property)) {
      a.push(property);
    }
  }
  return a;
};

var a = {a:1,b:2,c:3,d:4};
alert(a.toSource());

var b = Object.keys(a);
alert(b.toSource());
这也适用于:

var items = [
    {
        id: 1, name: 'Item 1'
    },
    {
        id: 2, name: 'Item 2'
    },
    {
        id: 3, name: 'Item 3'
    }
];
items.forEach(function(item, index) {
    console.log(item);
});
for…in语句遍历由字符串设置键控的对象的所有可枚举属性(忽略由符号设置键控的属性),包括继承的可枚举属性

因此,您可以定义不可枚举的属性

Object.defineProperty(Array.prototype, 'foo', {
  value: 'bar',
  enumerable: false // Defaults to false.
});

const arr = [1,2,3];
for(const k in arr) console.log(k); // 0, 1, 2
console.log(arr.foo); // bar

仅供参考,
hasOwnProperty
在IE 5.0版之前(5.5版之前)和Safari 2.02版之前不受支持。您可能会认为您不在乎支持这些浏览器,但您应该知道您不在乎。注意:
Object.keys
方法已经引入到ECMAScript第5版规范中,并且所有最近的浏览器都实现了它,在声明它之前,我们必须检查该方法是否已经定义。