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);
将属性附加到原型可以使这些属性可用于该对象的实例,而不是对象本身。