为什么我不能在JavaScript中获取导航器对象的属性数?

时间:2016-05-14 17:30:20

标签: javascript javascript-objects

在浏览器中运行(ES5 +)

var propCount = Object.keys(navigator).length;
console.log(propCount); // 0

如果你这样做的普通对象

let obj = {
    foo: 'bar',
    breaking: 'bad'
}

let propCount = Object.keys(obj).length;

console.log(propCount); // 2

为什么会这样?

很抱歉,如果它可能与另一个问题有关,例如当Object.keys(obj)只计算不包含functions/arrays的简单对象时,这是我第一次遇到它。

想知道它的原因。

3 个答案:

答案 0 :(得分:7)

Object.keys()函数返回直接分配给它的对象的属性。如果您执行以下操作:

   <!DOCTYPE html>
   <head>
   <style>
   /* mouse over link */
   a:hover {
   color: white;
   }
   </style>
   </head>
   <body
   <div class="flex-container">
   <div class="flex-item"><img src="cityscape.png">
   <a href="ArchitectureWork.html">arch</a></div>
   <div class="flex-item"><a href="FineArt.html">fine art</a></div>
   <div class="flex-item"><a href="Doodles.html">doodles</a></div>
   </div>
  </body>


 .flex-container {
   /*display: -webkit-flex;*/
   display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  color: aqua;
  align-content: center;
  padding-left: 90px;
  padding-right: 90px;

  }
 .flex-item{
 /*-webkit-flex: 1;*/
 /* I don't get order */
 order: 1;
 flex: 1;
 flex-basis: 20%;
 max-width: 1000px;
 min-width: 100px;
 align-self: center;
 padding-left: 10px;
 padding-right: 10px;
 padding-top: 20px;
 padding-bottom: 20px;

  }

如果要查看导航器的属性,请执行以下操作:

console.log(navigator.hasOwnProperty('permissions')); // false

它将列出navigator对象的所有属性,因为for ... in ... loop包含对象的原型。

答案 1 :(得分:4)

这是因为navigator的大多数属性都在Navigator原型上设置,navigator实例继承,Object.keys只返回{{1}上设置的属性对象本身。

您可以使用以下方法从原型中获取这些属性:

navigator

另外,Firefox在Object.keys(Object.getPrototypeOf(navigator)); 对象本身中具有以下属性:

navigator

答案 2 :(得分:1)

javascript中有可枚举和不可枚举的属性。 Object.keys()将返回对象的可枚举属性。所以在navigator对象中,似乎没有可枚举的自有属性。因此Object.keys(navigator)返回一个空数组。

来自文档,

  

Object.keys()方法返回给定对象自己的数组   可枚举的属性,与a提供的顺序相同   for ... in loop。

如果要列出某个对象的所有可枚举属性和非可枚举属性,则必须使用Object.getOwnPropertyNames()编写自己的逻辑。

  

注意:getOwnPropertyNames将返回枚举/非枚举   对象的属性。

function getAllProps(obj, props = []){
 if(Object.getPrototypeOf(obj) == null){ return props; }
 return getAllProps(Object.getPrototypeOf(obj),
           props.concat(Object.getOwnPropertyNames(obj)));
}

console.log(getAllProps(navigator));
//This will give you all the properties.

如果使用for..in循环,则只会在原型链中提供可枚举的属性。而你将不得不错过不可枚举的属性。