gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:50:49 24 4
gpt4 key购买 nike

当我在 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() 看到的所有属性? 目标气泡等发生了什么?

据我了解,getOwnPropertyNames() 应该返回所有属性,那么为什么会缺少一堆属性呢?这些是特殊类型的属性(property)吗?

如果我想要(我确实)有一种万无一失的方法来列出对象上的所有属性,我会怎么做?

最佳答案

My question is why Object.getOwnPropertyNames() doesn't return all the properties I can see from console.log()?

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

如果您稍微修改一下代码,您可以看到 bubbles (例如)位于 err 的原型(prototype)的原型(prototype)上(至少在 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();

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]

关于javascript - Object.getOwnPropertyNames() 似乎没有返回所有可访问的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55656965/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com