javascript - 给 Array.prototype 的 JS 函数被视为数组属性

标签 javascript definition function-prototypes

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/

相关文章:

Python 函数定义不起作用

函数的 JavaScript 原型(prototype)无法正常工作

c - 在 C 中是否可以一致地引用前向声明和非前向声明的结构?

c++ - #define EXIT_SUCCESS 0

javascript - 选择除隐藏之外的所有输入(但有一个异常(exception))

javascript - 切换不透明度并重新加载 div

swift - 如何在 Swift 中找到运算符定义?

c++ - 如何在类中声明一个类并在以后定义它?

javascript - 无限滚动,动态数据按上次修改状态排序

javascript - 如何对 AngularJS Controller 中的事件使用react