Javascript 自定义 Array.prototype 干扰 for-in 循环

标签 javascript

我试图用一个函数来扩展 Javascript 的对象类型,该函数检索属于该对象的所有属性名称(基本上是 PHP 的 array_keys() 函数对关联数组所做的)。

Object.prototype.keys = function() {
    var a = [];
    for (var property in this) {
        a.push(property);
    }
    return a;
};

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

var b = a.keys();
alert(b.toSource());

当变量 b 被提醒时,我期待看到 ["a","b","c","d"],但我'我看到 ["a","b","c","d","keys"]

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

是否可以在制作原型(prototype)的同时避免这种行为,或者我应该避免一起制作原型(prototype)?

最佳答案

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

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

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

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

关于Javascript 自定义 Array.prototype 干扰 for-in 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1529593/

相关文章:

javascript - 识别用户何时单击 Canvas 上的对象

JavaScript - 检查数组中的所有值是否都不是 Null - Array/Each/

javascript - 如何检查以确保在React中单击按钮时填写表格?

javascript - TypeError : db. collection is not a function in MongoDB Connection

javascript - 查找大写字母在句点之前出现的次数

javascript - 基本 Entity Framework Web API : The INSERT statement conflicted with the FOREIGN KEY constraint

javascript - Jquery AJAX执行失败 'setRequestHeader'

javascript - 如何在文档标题上添加 (1) 文本通知

javascript - 使用 Sizzle 选择缓存节点的子元素

javascript - 使用按钮在 iframe 中打开文件