Javascript getOwnPropertyNames()不';t似乎不返回所有可访问的属性

Javascript getOwnPropertyNames()不';t似乎不返回所有可访问的属性,javascript,Javascript,当我在JavaScript控制台中运行此代码时(我尝试过Firefox和Chromium): 我得到的答复是: 我的问题是为什么Object.getOwnPropertyNames()不返回我在console.log()中看到的所有属性?目标,气泡等发生了什么 我的理解是,getOwnPropertyNames()应该返回所有属性,那么为什么缺少一堆属性呢?这是一种特殊类型的财产吗 如果我想要(我做)一个简单的方法来列出一个对象上的所有属性,我会怎么做 我的问题是为什么Object.getOw

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

我得到的答复是:

我的问题是为什么
Object.getOwnPropertyNames()
不返回我在
console.log()
中看到的所有属性?
目标
气泡
等发生了什么

我的理解是,
getOwnPropertyNames()
应该返回所有属性,那么为什么缺少一堆属性呢?这是一种特殊类型的财产吗

如果我想要(我做)一个简单的方法来列出一个对象上的所有属性,我会怎么做

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

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

如果您稍微修改一下代码,您可以看到
气泡
(例如)位于
err
的原型的原型上(至少在Chrome中),并且确实是一个访问器属性:

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

更简单的例子:

//创建一个具有'answer'属性的对象
常数p={
答复:42
};
//使用该对象作为其原型创建对象
const o=Object.create(p);
console.log(Object.getOwnPropertyNames(o));//[]
console.log(Object.getOwnPropertyNames(Object.getPrototypeOf(o));//[“回答]
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();