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