如何迭代一个对象原型的属性

6

我有一些代码:

var obj = function() { }; // functional object
obj.foo = 'foo';
obj.prototype.bar = 'bar';

for (var prop in obj) {
    console.log(prop);
}

意外的是,记录的全部都是foo。因为我没有检查hasOwnProperty,所以我期望for循环也会遍历obj原型的属性(即bar)。我错过了什么?是否有一种惯用的方法可以遍历原型中的所有属性?
我在Chrome和IE10中进行了测试。
提前致谢。

1
将属性附加到原型上,则使这些属性可用于该对象的实例而不是对象本身。 - Patrick Evans
2个回答

6

您正在迭代构造函数的属性,您需要创建一个实例。实例是从构造函数的prototype属性继承的:

var Ctor = function() { }; // constructor function
Ctor.prototype.bar = 'bar';
var obj = new Ctor(); // instantiation

// adds own property to instance
obj.foo = 'foo';

// logs foo and bar
for (var prop in obj) {
    console.log(prop); 
}

0
如果您想通过在对象实例化之前定义所有属性来维护继承层次结构,可以采用以下方法。该方法打印原型层次链。
注意:在此方法中,您不必最初创建构造函数。
function myself() {
    this.g = "";
    this.h = [];
    this.i = {};
    myself.prototype = new parent();
    myself.prototype.constructor = myself;
}

function parent() {
    this.d = "";
    this.e = [];
    this.f = {};
    parent.prototype = new grandParent();
    parent.prototype.constructor = parent;
}

function grandParent() {
    this.a = "";
    this.b = [];
    this.c = {};
}

var data = new myself();
var jsonData = {};
do {
    for(var key in data) {
        if(data.hasOwnProperty(key) && data.propertyIsEnumerable(key)) {
            jsonData[key] = data[key];
        }
    }
    data = Object.getPrototypeOf(data).constructor.prototype;
    Object.defineProperties(data, {
        'constructor': {
            enumerable: false
        }
    });
} while (data.constructor.name !== "grandParent")
console.log(jsonData);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接