6

我有一些代码:

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 中对此进行了测试。

提前致谢。

4

2 回答 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); 
}
于 2013-09-24T17:36:41.950 回答
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);
于 2017-02-18T12:46:15.373 回答