Object理解
1. 属性描述符
对象里目前存在的属性描述符主要有两种形式:数据描述符和存取描述符。
- 数据描述符是一个拥有可写或不可写值的属性。
- 存取描述符不包含数据值,是由一对getter-setter函数功能来描述的属性。
- 描述符必须是两种形式之一;不能同时是两者。
四个特性
- configurable: 如果为 false,则任何尝试删除目标属性或修改属性以下特性(writable, configurable, enumerable)的行为将被无效化,默认值为 true。
- enumerable: 是否能枚举。也就是是否能被for-in遍历。默认值为 true
- writable: 是否能修改值。默认为 true
- value: 该属性的具体值是多少。默认为 undefined
1.1获取属性描述符
可以通过 Object.getOwnPropertyDescriptor来获取某个属性的属性描述符,或者Object.getOwnPropertyDescriptors获取对象全部的属性的属性描述符
// getOwnPropertyDescriptor() 获取自由属性的属性描述符
var obj = {
property1: 42
}
let desc = Object.getOwnPropertyDescriptor(obj, 'property1')
console.log(desc)
// 打印数据
/*
{
configurable: true,
enumerable: true,
value: 1,
writable: true
}
*/
1.2设置属性描述符
可以通过Object.defineProperties和Object.defineProperty对象属性的属性描述符进行设置
- defineProperties
var obj = { a: 1 }
Object.defineProperties(obj, {
'a': {
value: 2,
writable: false // 不可修改
}
})
obj.a = 3
// { a: 2 }
- defineProperty 当对象中的属性值变化之后,会触发defineProperty里面的set方法(vue数据劫持)defineProperty实现数据劫持
2.Object本身的方法
2.1 Object.assign()
// Object.assign(目标对象, 源对象) 返回值:目标对象
// 用于将所有可枚举属性的值从一个或多个源对象分配到目标对象
let obj = { a: 1 }
let obj1 = Object.assign({}, obj) // 浅拷贝
2.2 Object.create()
// Object.create(proto) 返回一个新对象
// 创建一个新对象,使用现有的对象来提供新创建的对象的__proto__
let oldProto = Array.prototype
let newObj = Object.create(oldProto)
console.log(newObj.__proto__ === oldProto) // true
2.3 Object.freeze()
// Object.freeze(obj) 返回值:被冻结的对象(数组也可)
// 冻结一个对象,冻结后将不能修改
let obj = { a: 1 }
obj = Object.freeze(obj)
obj.a = 2
console.log(obj.a) // 1
2.4 Object.entries()
// Object.entries(obj) 返回一个数组,其元素是与直接在 `object` 上找到的可枚举属性键值对相对应的数组
let obj = { a: 1, b: 2 }
obj = Object.entries(obj) // [ ['a', 1], ['b', 2] ]
2.5 Object.fromEntries() 谷歌73以上版本才支持
// 与Object.entries()相反 把数组变成对象
let arr = [ ['a', 1], ['b', 2] ]
let obj = Object.fromEntries(arr) // { a: 1, b: 2 }
2.6 Object.is()
// Object.is(obj) 返回值:Boolean 判断两个值是否为同一个值
let obj = {a:1}
let obj1 = {a:1}
Object.is(obj, obj1) // false 地址不同
2.7 Object.isExtensible()
// Object.isExtensible 返回值:Boolean 判断一个对象是否可扩展
let obj = { a: 1 }
Object.isExtensible(obj) // true
obj = Object.freeze(obj)
Object.isExtensible(obj) // false
2.8 Object.isFrozen()
方法判断一个对象是否被冻结
2.9 Object.seal()
方法封闭一个对象,阻止添加新属性并将所有现有属性标记为不可配置。当前属性的值只要原来是可写的就可以改变。
2.10 Object.isSealed()
判断一个对象是否被密封
2.11 Object.keys()
// Object.keys 返回值:key组成的数组
let obj = { a: 1, b: 2 }
Object.keys(obj) // [a,b]
2.12 Object.values()
// Object.values 返回值:value组成的数组
let obj = { a: 1, b: 2 }
Object.values(obj) // [1, 2]
3.Object原型上的方法 (Object.prototype)
3.1 constructor
// 返回创建实例对象的 Object 构造函数的引用
let obj = {}
obj.constructor === Object // true
obj.__proto__.constructor === Object // true
Object.prototype.constructor === Object // true
3.2 hasOwnProperty()
// 判断属性值是否在对象中 返回值:Boolean
let obj = { a: 1, b: 2 }
obj.hasOwnProperty('a') // true
obj.hasOwnProperty('c') // false
3.3 isPrototypeOf()
// 测试一个对象是否存在于另一个对象的原型链上
// prototypeObj.isPrototypeOf(object)
let obj = {}
Object.prototype.isPrototypeOf(obj) // true
3.4 toString()
let obj = {}
obj.toString() // "[object, object]"
3.5 valueOf()
调用 valueOf 方法将对象转换为原始值