Object.getOwnPropertyNames()似乎没有返回所有可访问的属性

时间:2019-04-12 17:34:45

标签: javascript

当我在JavaScript控制台中运行此代码时(我尝试过Firefox和Chromium):

var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
  //console.log(this);
};
xhttp.onerror = function(err) {
  console.log("Error: ");
  console.log(err);
  console.log("Error properties: ");
  console.log(Object.getOwnPropertyNames(err));
}
xhttp.open("GET", "https://www.google.com/", true); // CORS-blocking page to trigger the error
xhttp.send();

我收到以下答复:

enter image description here

我的问题是为什么Object.getOwnPropertyNames()不返回我从console.log()可以看到的所有属性? targetbubbles等发生了什么?

据我了解,getOwnPropertyNames()应该返回所有属性,那么为什么会丢失很多属性呢?这些是一种特殊的财产吗?

如果我想(我愿意)一种简单的方法来列出对象上的所有属性,该怎么办?

1 个答案:

答案 0 :(得分:1)

  

我的问题是为什么Object.getOwnPropertyNames()不能返回从console.log()中可以看到的所有属性?

getOwnPropertyNames中的“ own”表示仅获得 own 属性的名称,而不继承属性的名称。如果您的浏览器JavaScript引擎上的ProgressError实现将那些其他属性实现为原型上的访问器(甚至原型上的数据属性,尽管看起来不太可能),则它们将被继承。您可以访问继承的属性,但它们不会包含在getOwnPropertyNames的数组中。

如果稍微修改一下代码,您会看到bubbles(例如)在err的原型的原型上(至少在Chrome中),并且确实是访问器属性:< / p>

var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
  //console.log(this);
};
xhttp.onerror = function(err) {
  console.log("Error: ");
  let a;
  let level = 0;
  while (err) {
    a = Object.getOwnPropertyNames(err);
      console.log("Error:", err);
      console.log("Props:", a.join(", "));
    if (a.includes("bubbles")) {
        console.log(`Found bubbles at ${level}:`, Object.getOwnPropertyDescriptor(err, "bubbles"));
      break;
    }
    ++level;
    err = Object.getPrototypeOf(err);
  }
}
xhttp.open("GET", "https://www.google.com/", true); // CORS-blocking page to trigger the error
xhttp.send();

enter image description here

一个简单的例子:

// Create an object with an `answer` property
const p = {
  answer: 42
};
// Create an object using that object as its prototype
const o = Object.create(p);
console.log(Object.getOwnPropertyNames(o)); // []
console.log(Object.getOwnPropertyNames(Object.getPrototypeOf(o))); // ["answer]