javascript - 为什么 for...in 不打印对象的属性?

标签 javascript constructor prototypal-inheritance

我编写了以下 javascript,并期望看到列出的 Obj2 中的所有属性以及(我认为的)基类 - Object 的属性。为什么我看不到像prototype和toString这样的属性与一和二一起列出?

Obj2 = function() {
   this.one = "one";
   this.two = "two";
}

var obj2 = new Obj2();

for(var i in obj2) {
    try {
        console.log(i + ": " + obj2[i]);
    }
    catch(e) {
        console.log(i + " caused error: " + e);
    }
}

最佳答案

正如lan所说,for ... in仅在可枚举属性上进行迭代,如果您想获取实例的所有属性(可枚举或不可枚举),您可以尝试 Object.getOwnPropertyNames()

Live Demo

function Obj2() {
    this.one = "one";
    this.two = "two";
}

var obj2 = new Obj2(),
    proto = obj2,
    keys = Object.getOwnPropertyNames(proto);


while (proto) {
    for (var i in keys) {
        try {
            console.log(keys[i] + ": " + proto[keys[i]]);
        } catch (e) {
            console.log(i + " caused error: " + e);
        }
    }
    proto = Object.getPrototypeOf(proto);
    keys = proto ? Object.getOwnPropertyNames(proto) : null;
}

关于javascript - 为什么 for...in 不打印对象的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17244301/

相关文章:

javascript - 在 Kendo UI Mobile 中扩展移动 View ?

JavaScript 数字继承

javascript - 以现代方式获取 <select> 的值(value)?

javascript - 使用 jquery 更改 div 文本

templates - 如何更改 phpstorm 自定义构造函数模板?

c++ - 使用参数构造函数模拟 new[]

javascript - 为什么 Object.create 在 JavaScript 中的原型(prototype)继承方面没有达到我的预期

javascript - <a> 标签仅适用于双击,不适用于单击

javascript - 以编程方式将 <a> 添加到 SVG 路径对象

java - 通过 Streams 在 double 组上调用构造函数