Javascript 提供给Array.prototype的JS函数被视为数组属性
这将登录(在chrome中) 或是身体力行 我的问题是,为什么清单中显示了这个函数,即使它是给数组原型的 这对扩展未使用的浏览器功能有影响(例如,IE extended Array.filter在使用Array in时的行为会有所不同等) 编辑:Javascript 提供给Array.prototype的JS函数被视为数组属性,javascript,definition,function-prototypes,Javascript,Definition,Function Prototypes,这将登录(在chrome中) 或是身体力行 我的问题是,为什么清单中显示了这个函数,即使它是给数组原型的 这对扩展未使用的浏览器功能有影响(例如,IE extended Array.filter在使用Array in时的行为会有所不同等) 编辑: 为了澄清,我无法访问执行for-in循环的代码,因为它是一个外部库。因此,这个问题的表述,更多的是关于“为什么会这样”而不是如何解决这个问题 for in循环将遍历对象的所有继承属性及其自身属性。Ecmascript 5中有一种方法可以对枚举隐藏属性,
为了澄清,我无法访问执行for-in循环的代码,因为它是一个外部库。因此,这个问题的表述,更多的是关于“为什么会这样”而不是如何解决这个问题 for in循环将遍历对象的所有继承属性及其自身属性。Ecmascript 5中有一种方法可以对枚举隐藏属性,请参阅,但在IE中不起作用。建议迭代数组的方法是使用普通for循环:
1
2
b
c
function () {console.log('hep');}
这将反向迭代数组,并避免附加的
len
变量。for in循环将遍历对象的所有继承属性及其自身属性。Ecmascript 5中有一种方法可以对枚举隐藏属性,请参阅,但在IE中不起作用。建议迭代数组的方法是使用普通for循环:
1
2
b
c
function () {console.log('hep');}
这将反向迭代数组,并避免附加的
len
变量。添加到对象原型上的任何内容都将出现在该对象的所有实例中。这就是我们如何在javascript中扩展对象的方法
请参阅:您添加到对象原型上的任何东西都将出现在该对象的所有实例中。这就是我们如何在javascript中扩展对象的方法
请参阅:道格拉斯·克罗克福德显然也写过同样的问题 该漏洞是for in语句,它可以枚举密钥 存储在对象中,生成对象的 原型链,而不仅仅是对象本身中的关键点。这导致 继承的方法将显示在枚举中,这是错误的。如果愿意 如果JavaScript不包含此缺陷,则会更好,但是 幸运的是,我们可以围绕它进行编程
道格拉斯·克罗克福德显然也写过同样的问题 该漏洞是for in语句,它可以枚举密钥 存储在对象中,生成对象的 原型链,而不仅仅是对象本身中的关键点。这导致 继承的方法将显示在枚举中,这是错误的。如果愿意 如果JavaScript不包含此缺陷,则会更好,但是 幸运的是,我们可以围绕它进行编程
JavaScript对象是属性的集合。在这些属性中,有描述属性的属性。您在这里看到的主要属性是[[Enumerable]]属性,它是扩展到JavaScript中大多数默认对象(如数组和对象)的元属性。ECMAScript 5定义了一种用于添加非[[Enumerable]]对象的方法,但浏览器中可能不广泛支持这种方法 防止枚举不需要的对象属性的一种方法是检查对象属性是否具有名为
[[GetOwnProperty]]]
的内部属性方法。这确保了该属性直接在对象上调用,而不是在原型链的某个位置继承
for (var i = b.length; i--;)
console.log(b[i])
来源:JavaScript对象是属性的集合。在这些属性中,有描述属性的属性。您在这里看到的主要属性是[[Enumerable]]属性,它是扩展到JavaScript中大多数默认对象(如数组和对象)的元属性。ECMAScript 5定义了一种用于添加非[[Enumerable]]对象的方法,但浏览器中可能不广泛支持这种方法 防止枚举不需要的对象属性的一种方法是检查对象属性是否具有名为
[[GetOwnProperty]]]
的内部属性方法。这确保了该属性直接在对象上调用,而不是在原型链的某个位置继承
for (var i = b.length; i--;)
console.log(b[i])
来源:谢谢你的回答。我遇到这个问题的原因是我们正在使用一个用于迭代的外部库。谢谢你的回答。我碰到这个问题的原因是我们使用的是一个外部库,它在迭代过程中可以执行。不幸的是,我无法更改代码来执行此操作,因为它是从另一台服务器加载的库。所以我主要感兴趣的是问题为什么会发生,以及我能做些什么来避免它发生。。。这意味着在本例中我不能扩展Array.prototype.Marcus-您可以使用obj.hasOwnProperty(var)方法。此处演示:如果这对您不起作用,请与我联系。我了解其工作原理并解决了根本问题。我的意思是,问题在于我正在使用的开源组件(openLayers)。如果我在Openlayers中修复了这个问题(它在中广泛使用),我将被自定义绑定到该版本。所以出于实际原因,我不得不承认,在当前的项目中,我不能扩展阵列原型。但是如果我自己在中使用var,我一定会使用obj.hasOwnProperty检查…@Marcus您可以尝试使用
delete Array.prototype.testi
在数组原型中删除它。不幸的是,我无法更改代码来执行此操作,因为它是从另一台服务器加载的库。所以我主要感兴趣的是问题为什么会发生,以及我能做些什么来避免它发生。。。这意味着在本例中我不能扩展Array.prototype.Marcus-您可以使用obj.hasOwnProperty(var)方法。此处演示:如果这对您不起作用,请与我联系。我了解其工作原理并解决了根本问题。我的意思是,问题在于我正在使用的开源组件(openLayers)。如果我在Openlayers中修复了这个问题(它在中广泛使用),我将被自定义绑定到该版本。所以出于实际原因,我不得不承认在当前项目中我不能扩展数组
var arr = ['a','b','c'], indexes = [];
Array.prototype.each = function() {/*blah*/};
for (var index in arr) {
if (arr.hasOwnProperty(index)) {
indexes.push(index);
}
}
indexes; //["0", "1", "2"]