Js Object方法总结

456 阅读3分钟

Object理解

1. 属性描述符

对象里目前存在的属性描述符主要有两种形式:数据描述符和存取描述符。

  1. 数据描述符是一个拥有可写或不可写值的属性。
  2. 存取描述符不包含数据值,是由一对getter-setter函数功能来描述的属性。
  3. 描述符必须是两种形式之一;不能同时是两者。

四个特性

  • 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.definePropertiesObject.defineProperty对象属性的属性描述符进行设置

  • defineProperties
var obj = { a: 1 }
Object.defineProperties(obj, {
	'a': {
		value: 2,
		writable: false // 不可修改
	}
})
obj.a = 3
// { a: 2 }

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 方法将对象转换为原始值