如何循环访问对象的原型属性

How to iterate over an object's prototype's properties

本文关键字:对象 原型 属性 访问 何循环 循环      更新时间:2023-09-26

我有一些代码:

var obj = function() { }; // functional object
obj.foo = 'foo';
obj.prototype.bar = 'bar';
for (var prop in obj) {
    console.log(prop);
}

令我惊讶的是,记录的所有内容都是foo。我希望 for 循环也能迭代obj原型的属性(即 bar(,因为我没有检查hasOwnProperty。我在这里错过了什么?有没有一种惯用的方式来迭代原型中的所有属性?

我在Chrome和IE10中对此进行了测试。

提前谢谢。

您正在迭代构造函数的属性,您必须创建一个实例。该实例继承自构造函数的 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); 
}

如果要通过在对象实例化之前定义所有属性来维护继承层次结构,则可以遵循以下方法。此方法打印原型层次结构链。

注意:在此方法中,您不必最初创建构造函数。

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);