成语只是获得“自己的对象”,而不是原型链

时间:2015-05-11 12:25:14

标签: javascript

是否有一种公认的习惯用法来获取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
}

4 个答案:

答案 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;
&#13;
&#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()

Fiddle demo

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