当我在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();
我收到以下答复:
我的问题是为什么Object.getOwnPropertyNames()
不返回我从console.log()
可以看到的所有属性? target
,bubbles
等发生了什么?
据我了解,getOwnPropertyNames()
应该返回所有属性,那么为什么会丢失很多属性呢?这些是一种特殊的财产吗?
如果我想(我愿意)一种简单的方法来列出对象上的所有属性,该怎么办?
答案 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();
一个简单的例子:
// 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]