Javascript 如何迭代对象';s原型&x27;s属性

Javascript 如何迭代对象';s原型&x27;s属性,javascript,prototype,prototype-chain,Javascript,Prototype,Prototype Chain,我有一些代码: 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。我错过了什么?还有一种惯用的方法来迭代原型中的所有属性吗 我在Ch

我有一些代码:

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

将属性附加到原型可以使这些属性可用于该对象的实例,而不是对象本身。