在这个特定的例子中,为什么作者在for ... in循环模式中使用if ... hasOwnProperty?

时间:2014-11-10 22:52:00

标签: javascript object dom

我已阅读以下文章,了解如何使用拥有自己的属性阻止您枚举对象原型上定义的属性:

- MDN hasOwnProperty

- How do I check if an object has a property in JavaScript?

- for..in and hasOwnProperty

我想我得到了这个模式的一般工作方式以及为什么要使用它,但我仍然不明白为什么,在Eloquent Javascript的CH 19的下面的代码中,作者选择使用这种模式...

function elt(name, attributes) {
  var node = document.createElement(name);
  if (attributes) {
    for (var attr in attributes)              
      if (attributes.hasOwnProperty(attr))       // <----------------
        node.setAttribute(attr, attributes[attr]);
  }
  for (var i = 2; i < arguments.length; i++) {
    var child = arguments[i];
    if (typeof child == "string")
      child = document.createTextNode(child);
    node.appendChild(child);
  }
  return node;
}

顺便说一下,这个功能的用途是:

  

它创建一个具有给定名称和属性的元素并追加   它作为子节点获得的所有进一步参数,自动转换   字符串到文本节点。

有人可以引导我完成这个特定的例子吗?

1 个答案:

答案 0 :(得分:1)

结构for (var attr in attributes)迭代所有可迭代属性,包括原型上的项目。

如果您只想迭代实际直接分配给对象的属性,而不是原型上的属性,那么您可以使用.hasOwnProperty()作为您指向的代码进行过滤。该代码将跳过原型上的任何可迭代属性,并且只会迭代实际对象本身的属性。