Object 对象
2019-08-01 本文已影响0人
行走的蛋白质
一. 对象的方法
- getOwnPropertyDescriptor
获取属性的描述对象
let obj = {name: 'protein', color: 'white'}
console.log(Object.getOwnPropertyDescriptor(obj, 'name'))
/* {
value: "protein", // 值
writable: true, // 是否可修改
enumerable: true, // 是否可枚举 --- 是否可通过 for in 来循环,通过 defineProperty 定义的属性默认为 false
configurable: true // 是否可配置 --- 常用是否可以删除
} */
console.log(Object.getOwnPropertyDescriptor([1, 2], 'length')) //对比加强理解
- defineProperty
修改属性
Object.defineProperty(obj, 'name', {
value: 'potato',
writable: false,
enumerable: false,
configurable: false
})
console.log(obj)
// {color: "white", name: "potato"}
delete obj.name
console.log(obj.name)
// potato
obj.name = 'tomato'
console.log(obj.name)
// potato
for(let v in obj) {
console.log(v)
}
// color
二. 遍历对象的方法
const obj = { 'name': "protein", 'age': '18', 'sex': 'male' };
Object.prototype.pro1 = function() {};//在原型链上添加属性
Object.defineProperty(obj, 'country', {
enumerable: true, //可枚举
value: 'china'
});
Object.defineProperty(obj, 'nation', {
enumerable: false //不可枚举
});
Object.defineProperty(obj, 'otherInfo', {
enumerable: true //可枚举
});
obj.otherInfo = 'otherInfo';
const sym = Symbol('sym');
obj[sym] = 'sym';
const prototypeSym = Symbol('prototypeSym');
Object.prototype[prototypeSym] = 'prototypeSym';
- for...in, 遍历对象自有以及原型上的可枚举属性 ( 不含Symbol属性 ) , 先遍历自有属性, 然后在遍历原型上的属性
for (var index in obj) {
console.log('key=', index, 'value=', obj[index])
}
for...in
- Object.keys(), 遍历对象自有可枚举属性 ( 不含Symbol属性 ) , 返回一个 key 值组成的数组, 不包含原型上的属性
Object.keys(obj).forEach(function(key) {
console.log(key, obj[key])
});
Object.keys()
- Objcet.getOwnPropertyNames(), 输出对象自身的可枚举和不可枚举属性的数组 ( 不含Symbol属性 ) , 不输出原型链上的属性
Object.getOwnPropertyNames(obj).forEach(function(key) {
console.log(key, obj[key])
});
Objcet.getOwnPropertyNames()
- Reflect.ownKeys(), 返回对象自身的所有属性, 不管属性名是 Symbol 或字符串, 也不管是否可枚举
Reflect.ownKeys(obj).forEach(key => {
console.log(key, obj[key])
})
Reflect.ownKeys()