Array.prototype.testi = function() {console.log('hep');}
var b = new Array();
b.push(1, 5, 'b', 'c');
for (var i in b) {
console.log(b[i]);
}
这将记录(在 chrome 中)
1
2
b
c
function () {console.log('hep');}
或 http://jsfiddle.net/marqs/6VVka/1/ 中的实例
我的问题是,为什么列表中显示了该函数,即使它已提供给数组原型(prototype)?
这对扩展未使用的浏览器功能有影响(例如,如果使用 array in 等,IE 扩展的 Array.filter 将表现不同)。
编辑: 澄清一下,我无法访问执行 for-in 循环的代码,因为它是一个外部库。因此,问题的提法更多地是关于“为什么会这样”,而不是如何解决这个问题。
最佳答案
JavaScript 对象是属性的集合。在这些属性里面,有描述属性的属性。您在这里看到的主要是 [[Enumerable]] 属性,它是扩展到 JavaScript 中大多数默认对象(例如 Array 和 Object)的元属性。 ECMAScript 5 定义了一种添加非 [[Enumerable]] 对象的方法,但浏览器可能不广泛支持该方法。
防止枚举不需要的对象属性的一种方法是检查对象属性是否具有名为 [[GetOwnProperty]]
的内部属性方法。这确保了该属性是直接在对象上调用的,而不是沿原型(prototype)链的某个地方继承的。
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"]
来源:http://javascriptweblog.wordpress.com/2011/01/04/exploring-javascript-for-in-loops/
关于javascript - 给 Array.prototype 的 JS 函数被视为数组属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7722750/