enumerable的用法
var person = {
name: "codereasy",
age: 30,
gender: "male",
};
for (var key in person) {
console.log(key + ": " + person[key]);
}
// 使用 Object.keys 遍历属性
// var keys = Object.keys(person);
// for (var i = 0; i < keys.length; i++) {
// var key = keys[i];
// console.log(key + ": " + person[key]);
// }
Object.keys无法遍历,for…in也不能遍历。
Object.getOwnPropertyNames可以遍历
var obj = {};
Object.defineProperty(obj, "visibleProperty", {
value: "我是可枚举的",
enumerable: true,
});
Object.defineProperty(obj, "hiddenProperty", {
value: "我是不可枚举的",
enumerable: false,
});
console.log(Object.keys(obj));
console.log(Object.getOwnPropertyNames(obj));
操作属性描述符
Object.defineProperty()
用于为对象添加一个新属性或修改一个已有的属性,并且可以详细地控制这个属性的特性。
var obj = {}; //定义空对象
Object.defineProperty(obj, "age", {
value: 18,
writable: false, //禁止修改属性值
});
obj.age = 28; //由于禁止修改,此时修改失败
console.log(obj.age); //结果仍然是18
console.log(Object.getOwnPropertyDescriptor(obj, "age").value); //返回18
Object.defineProperties() 与 Object.defineProperty() 的主要区别在于,Object.defineProperties() 允许一次性为对象定义多个属性,而 Object.defineProperty() 一次只能定义一个属性。
var obj = {}; // 定义空对象
Object.defineProperties(obj, {
age: {
value: 18,
writable: false, // 禁止修改属性值
},
name: {
value: "codereasy",
writable: true, // 可以修改属性值
},
});
console.log(obj.age); // 输出 18
console.log(obj.name); // 输出 John
obj.age = 20; // 尝试修改age属性值(失败,因为它是不可写的)
obj.name = "蔡徐坤"; // 尝试修改name属性值(成功)
console.log(obj.age); // 仍然输出 18
console.log(obj.name); // 输出 蔡徐坤
如果我们想获取某个对象的属性描述符。
var obj = {};
Object.defineProperty(obj, "age", {
value: 18,
writable: false,
});
// 使用 Object.getOwnPropertyDescriptor 获取 age 属性的描述符
var descriptor = Object.getOwnPropertyDescriptor(obj, "age");
console.log(descriptor);