js高级 对象的属性及方法 描述对象属性 原型链
以对象为原型创建一个新对象 Object.create()
var o={a:1};
var o1=Object.create(o);
o1.b=2;
描述对象属性:
var o1={z:10};
var o=Object.create(o1); //以o1为原型创建o对象
o.a=1;
Object.defineProperty(o,"b",{
configurable:true,//是否可删除属性和可修改描述对象属性 o.b可删除
enumerable:true,//是否可枚举属性 可通过for in 枚举
writable:true,//是否可写属性 可写
value:1//值
})
delete o.b;
console.log(o);
Object.assign()合并复制对象,浅复制,并返回复制后的目标对象,只复制对象属性,不能赋值原型链属性,不能复制不可枚举属性
var o={a:1};
var o1={b:2};
Object.defineProperty(o1,"hello",{
onfigurable:true,//可删除属性和可修改描述对象
enumerable:false,//不可枚举属
writable:true,//可写
value:1//值
})
var o3={c:3};
var o4={d:4};
var o5=Object.assign(o,o1,o3,o4);
console.log(o) //{a: 1, b: 2, c: 3, d: 4}
作用:
onfigurable 保护对象该键值对,不被删除和修改
enumerable 不暴露对象中该键值对
writable 对象中该键值对为只读
描述对象中属性缺少时,该属性默认为false
var o = {a:1}
// 描述对象中属性缺省时,该属性默认为false
Object.defineProperty(o,"b",{
value:2
})
delete o.b; // 不起作用
for(var key in o){
console.log(o[key]) //只输出 1
}
console.log(o) // {a:1,b:2}
var o = {a:1}
// 给对象定义多个属性
Object.defineProperties(o,{
b:{
numerable:true, //可枚举
configurable:true, //可删除修改
value:1
},
c:{
writable:true, //可写
configurable:true, //可删除修改
value:2
}
})
var x=Symbol();
o[x]=10;
for(var key in o){
console.log(key) // 只输出 a,b Symbol()对象不可枚举
}
console.log(o) //{a: 1, b: 1, c: 2, Symbol(): 10}
// 获取当前对象的所有属性,包括不可枚举属性,并且返回一个属性组成的数组
// 不能获取到原型链属性,不能获取Symbol属性
var names=Object.getOwnPropertyNames(o)
console.log(names); // ['a', 'b', 'c']
// 专门获取Symbol属性
var namesSymbol=Object.getOwnPropertySymbols(o);
console.log(namesSymbol) //[Symbol()]
// 可以获取到对象的所有属性,包括Symbol属性
var names=Reflect.ownKeys(o);
console.log(names); //['a', 'b', 'c',Symbol()]
// 获取对象下某属性的描述对象
var desc=Object.getOwnPropertyDescriptor(o,"c");
console.log(desc); //{value: 2, writable: true, enumerable: false, configurable: true}
// 获取对象中所有属性的描述对象
var desc=Object.getOwnPropertyDescriptors(o)
console.log(desc)
Object.entries() 将对象转为迭代器数组 对象转Map
var o={a:1,b:2,c:3};
console.log(Object.entries(o));//[['a', 1],['b',2],['c',3]]
// 使用entries将对象转换为迭代器数组,并且放在map中
var m=new Map(Object.entries(o));
m.forEach((value,key)=>{
console.log(value,key)
})
// 1 'a'
// 2 'b'
// 3 'c'
Object.fromEntries() 将map转对象 ,对set没有作用,会报错 ,可以将formData 转为对象
// 键值对的类型可以通过Object.fromEntries转换为对象
var m=new Map();
m.set("a",1);
m.set("b",2);
m.set("c",3);
// 将迭代器变为对象
console.log(Object.fromEntries(m)); {a:1,b:2,c:3}
Object.freeze(o); 冻结 就是将对象中所有属性设置为不可删除,不可修改,不可扩展添加
console.log(Object.isFrozen(o)); 判断是否冻结
Object.preventExtensions(o); 设置不可扩展对象 可以修改,可以删除,但是不可以扩展添加
console.log(Object.isExtensible(o)) 判断是否禁止扩展
Object.getPrototypeOf(o1) 获取o1的原型链 等同 o1.proto
Object.setPrototypeOf(o1,o); 将某个对象设置为另一个对象的原型链 将o作为o1的原型链
Object.keys(o) 只能获取到可以枚举的字符串属性
Object.values(o) 获取对象下可以枚举的字符串属性的值