是否有一种公认的习惯用法来获取JavaScript中的自有对象?即我想在IE10及以上版本中删除对象的原型链。
function O() {
this.foo = 'foo';
}
O.prototype = { bar: 'bar' }
var o = new O();
for(var v in o) {
console.log(v); // foo bar
}
// ...but I just want an object representing the own properties and their values
o.__proto__ = null; // But I need this to work in IE10
for(var v in o) {
console.log(v); // foo
}
答案 0 :(得分:2)
您可以使用hasOwnProperty
排除原型属性:
for(var v in o) {
if (o.hasOwnProperty(v)) {
console.log(v); // foo
}
}
或使用Object.keys
仅检索实例属性:
var props = Object.keys(o);
console.log(props); //=> ['foo']
为了能够使用或不使用som构造函数的原型,您可以为该构造函数创建一个工厂函数,例如(在IE10中测试和工作):
function OFactory( useproto ) {
function O() {
this.foo = 'foo';
}
O.prototype = useproto;
return new O;
}
var o = OFactory({bar: 'bar'});
var p = OFactory();
var q = OFactory({bar: 'bar', foox: 'foox', fooy: 'fooy'});
for (var l in o) {
log('o['+l+']');
}
for (var l in p) {
log('p['+l+']');
}
for (var l in q) {
log('q['+l+']');
}
function log(str) {
var res = document.querySelector('#result'),
current = res.textContent;
res.textContent = [current, str].join('\n');
}

<pre id="result"></pre>
&#13;
答案 1 :(得分:2)
您想分别查看Object.getOwnPropertyNames()
Object.keys()
。两者之间的区别是,getOwnPropertyNames
还会枚举不可枚举标记的属性,而keys()
会隐藏这些属性。
Object.getOwnPropertyNames()方法返回一个直接在给定对象上找到的所有属性(可枚举或不可枚举)的数组。
答案 2 :(得分:1)
我不知道直接获取没有原型链的对象的方法,但是你可以改变你的循环,以便跳过这些元素:
for(var v in o) {
if (o.hasOwnProperty(v)) {
//Voodoo magic here.
}
}
答案 3 :(得分:1)
您可以使用Object.getOwnPropertyNames()或Object.keys()。
function O() {
this.foo = 'foo';
}
O.prototype = { bar: 'bar' }
var o = new O();
for(var v in o) {
console.log(v); // foo bar
}
Object.getOwnPropertyNames(o).forEach(function(val, idx, array) {
console.log("getOwnPropertyNames() " + val);
});
Object.keys(o).forEach(function(val, idx, array) {
console.log("keys() " + val);
});