在 javascript 中几乎所有的对象都是 Object 的实例, Object 看似很简单,也有很多小技巧可以帮助我们编写更高质量的代码。
1、Object.create()
一个现有对象作为原型创建一个新对象。
读过一些开源框架、库源码的同学经常会看到 Object.create(null)
的代码用来创建一个新对象,那么为什么不直接用 {}
字面量,而是传入 null
来创建一个空对象。 原因是 {}
实际是 Object.create(Object.prototype)
的结果,带有原型链的。Object.create(null)
更纯净,什么都没有。可以避免很多方法,或者属性访问,追溯对象的原型链起到性能优化的作用。
2、Object.keys() 、 Object.values()
- keys : 返回可枚举的属性key值
- values : 返回可枚举的属性value值
不可枚举: 原型链上,key值是对象类型,enumerable 设置 false
3、Object.toString()
返回用于表示对象的字符串, 并非 JSON.stringify
进行 序列化
时调用的方法。 序列化时调用的方法是 toJSON
4、Object.defineProperty()
在对象上定义一个新属性, Vue2
的响应式核心方法,在创建响应式对象时,在调用 get 时进行依赖收集,在 set 调用时执行依赖回调函数
Object.defineProperty(obj, "key", {
get() {
return bValue;
},
set(newValue) {
bValue = newValue;
},
enumerable: true,
configurable: true,
});
5、Object.freeze() 、Object.seal() 、Object.preventExtensions()
都仅作用本身,原型链上依旧可以修改
- freeze : 冻结 ,无法修改值,无法扩展、删除属性 ,最严格
- seal : 固定,可以修改值,无法扩展、删除属性
- preventExtensions: 不能扩展新属性,可以修改,删除属性 ,最宽松
场景:一般用于基础库,工具中,为了防止外界修改内部属性,进而导致功能异常,需要把对象固定。
6、Object.entries() 、Object.fromEntries()
- entries : 对象 => 键值对数组
- fromEntries : 键值对数组 => 对象
场景1: 对象 => map
const map = new Map(Object.entries(obj));
场景2: 过滤对象中指定的key, 处理对象中指定的key的值
const filterProperty = (obj,filter) => {
return Object.fromEntries(Object.entries(obj).filter(([key,value]) => filter(key)))
}
const handleProperty = (obj,handle) => {
return Object.fromEntries(Object.entries(obj).map(([key,value]) => [key,handle(key,value)]))
}