问题: 根据{{3}} 属性描述符就像具有自己的属性的对象,例如:
{
value:
writable:
readable:
configurable:
enumerable:
}
一个人可以用普通物体做到这一点:
for(var n in object) {
console.log(object[n]);
}
写出该对象中键的值。 我也想这样做获取描述符,然后为每个描述符打印值。
这是我尝试执行此操作的几种方法之一。对于描述符中的每个属性描述符,请打印出其属性的值。
我想得到类似的东西 “约翰·多伊” 0 等等...
基本上,换句话说,使用描述符显示存储在对象中的值。
自己尝试: 我尝试了很多次,很多次,很多次 实际忘记了,必须删除它才能使我的头从以前的混乱中弄清楚。除了我的预期之外,它产生了各种可以想象的输出。像数字:0、1、2、3、4 ...属性的名称而不是它们的值,或“ undefined”行,而我期望的是 “约翰·多伊” 0 功能 功能 10个... 我DID检查stackoverflow,以及其他页面。 https://javascript.info/property-descriptors 仅是3-4的一种。 这不是一项作业,我也相信使用描述符可能不是最佳做法,但是我感到沮丧和执迷,因为我认为这是有可能的。 对于代码的最终怪异性,我也表示歉意。我是Java语言的新手。我希望人们专注于问题而不是其他东西。英语不是我的母语。我尽力使代码尽可能短,并且可复制。希望它明确了我要做什么,否则我可能只会放弃xD。
代码
"use strict";
function Person() {
this._name = "";
this.age = 0;
this.greet = function() {
console.log(`hi Im ${this._name} and im ${this.age} years old`);
};
this.beep = function(times) {
for(var i = 0; i < times; i++) {
console.log("beeeep");
}
};
Object.defineProperty(this, "something", {
value: 10,
writable: false,
readable: true,
configurable: false,
enumerable: true,
});
Object.defineProperty(this, "name", {
get() {
return this._name;
},
set(nam) {
this._name = nam;
}
} );
}
var obj = new Person();
console.log(obj.something);
obj.name = "John Doe";
console.log(obj.name);
console.log("##############");
var properties = Object.getOwnPropertyDescriptors(obj);
for(var property in properties) {
for(var val in property) {
console.log(property[val]);
}
}
答案 0 :(得分:0)
property
是字符串,即getOwnPropertyDescriptors
返回的对象中属性的名称。您希望第二个循环使用该属性的 value :
var properties = Object.getOwnPropertyDescriptors(obj);
for(var property in properties) {
var descriptor = properties[property]; // ***
for(var val in descriptor) {
// *** --------^^^^^^^^^^
console.log(property[val]);
}
}
或者在现代环境中,您可能会改用Object.values
或Object.entries
:
const properties = Object.getOwnPropertyDescriptors(obj);
for (const [propName, descriptor] of Object.entries(properties)) {
console.log(`${propName}:`);
for (const [key, value] of Object.entries(descriptor)) {
console.log(` ${key}: ${value}`);
}
}
实时示例:
"use strict";
function Person() {
this._name = "";
this.age = 0;
this.greet = function() {
console.log(`hi Im ${this._name} and im ${this.age} years old`);
};
this.beep = function(times) {
for(var i = 0; i < times; i++) {
console.log("beeeep");
}
};
Object.defineProperty(this, "something", {
value: 10,
writable: false,
readable: true,
configurable: false,
enumerable: true,
});
Object.defineProperty(this, "name", {
get() {
return this._name;
},
set(nam) {
this._name = nam;
}
} );
}
var obj = new Person();
console.log(obj.something);
obj.name = "John Doe";
console.log(obj.name);
console.log("##############");
const properties = Object.getOwnPropertyDescriptors(obj);
for (const [propName, descriptor] of Object.entries(properties)) {
console.log(`${propName}:`);
for (const [key, value] of Object.entries(descriptor)) {
console.log(` ${key}: ${value}`);
}
}
.as-console-wrapper {
max-height: 100% !important;
}
答案 1 :(得分:0)
property
是一个键而不是一个 value ,请使用该 key 来访问相关的 value 对象:
for(var property in properties) {
for(var val in properties[property]) {
console.log(property, val, properties[property][val]);
}
}
答案 2 :(得分:0)
显然,它几乎鼓励回答自己的问题。 让我失望的是,需要在for循环中进行“反向引用”。 (也许是由于之前学习过Java)。
要获取属性值,需要提及包含属性值的对象。
说明 [属性]
并获取您所需要的内容
说明[属性] [任何内容]
无论如何。如果有人想知道,这里是现在可以正常工作的代码,变量名称稍有不同。但话又说回来,更短,更容易理解。准确显示我在寻找什么:D
"use strict";
function User(name, age) {
this.name = name;
this.age = age;
this.func = function() {
console.log("hola");
};
}
var person = new User("John Doe", 22);
var descriptors = Object.getOwnPropertyDescriptors(person);
for(var property in descriptors) {
console.log(property);
for(var k in descriptors[property]) { //<-------------
console.log(k + " " + descriptors[property][k]);//<-----------
}
console.log("_______________");
}
我用注释中的箭头表示以前没有得到的东西。