Javascript Object 常用方法大全

Javascript Object 常用方法大全

Object.assign:

将所有可枚举属性的值从一个或多个对象复制到目标对象,并返回目标对象

const obj1 = { a: 1, b: 3}
const obj2 = { a: 5, c: 6}
const obj3 = Object.assign(obj1, obj2)

console.log(obj1) // { a: 5, b: 3, c: 6}
console.log(obj2) // { a: 5, c: 6}
console.log(obj3) // { a: 5, b: 3, c: 6}
const obj1 = { a: 1, b: 3}
const obj2 = { a: 5, c: 6}
const obj3 = Object.assign({}, obj1, obj2)

console.log(obj1) // { a: 1, b: 3}
console.log(obj2) // { a: 5, c: 6}
console.log(obj3) // { a: 5, b: 3, c: 6}

Object.defineProperty

定义或修改一个对象中的属性

Object.defineProperties

定义或修改一个对象中的多个属性

Object.getOwnPropertyDescriptor

获取一个对象中的一个属性描述

Object.getOwnPropertyDescriptors

获取一个对象中的所有属性描述

/*
 * 数据属性
 * [[Configurable]]: 能否通过delete删除此属性,能否修改属性的特征
 * [[Enumerable]]: 该属性是否可枚举,即是否可通过for-in或Object.keys()返回属性
 * [[Writable]]: 能否修改属性的值
 * [[Value]]: 该属性的值,默认为undefined
 *
 * 访问器属性
 * [[Configurable]]、[[Enumerable]] 和数据属性一致
 * [[Get]]: 提供一个 getter 方法,访问对象属性时会调用该方法
 * [[Set]]: 提供一个 setter 方法,读取对象属性时会调用该方法
 */

// defineProperty
const obj = new Object()
Object.defineProperty(obj, 'name', {
  configurable: false,
  writable: false,
  enumerable: true,
  value: '一个不能被修改的名字'
})
console.log(obj.name) // '一个不能被修改的名字'


// defineProperties
const obj2 = new Object()
Object.defineProperties(obj2, {
  name: {
    writable: true,
    value: '张三'
  },
  Name: {
    get: function() {
      return `${this.name}先生`
    },
    set: function(value) {
      this.name = value || '未知'
    }
  }
})
console.log(obj2.name)  // 张三
console.log(obj2.Name)  // 张三先生
obj2.Name = ''
console.log(obj2.name)  // 未知

// getOwnPropertyDescriptor
Object.getOwnPropertyDescriptor(obj2, 'name')  // ...
Object.getOwnPropertyDescriptor(obj2)  // ...
Object.entries: 返回一个对象自身可枚举属性的键值对,顺序与for-in循环时的顺序一致
const obj = { foo: 'bar', baz: 42 }
Object.entries(obj) // [["foo", "bar"],["baz", 42]]
Object.freeze: 冻结一个对象(只有一层),不能修改任何信息,包括新增属性、删除属性、修改属性值
Object.isFrozen: 判断一个对象是否已经被冻结
const obj = {
  a: 1,
  b: {
    c: 2
  }
}
console.log(obj.a)    // 1
console.log(obj.b.c)  // 2

obj.a = 3
obj.b.c = 4
console.log(obj.a)    // 3
console.log(obj.b.c)  // 4

Object.isFrozen(obj)  // false
Object.freeze(obj)
Object.isFrozen(obj)  // true
obj.a = 5
obj.b.c = 6
console.log(obj.a)    // 3
console.log(obj.b.c)  // 6

Object.keys

获取一个对象中所有的key值(不包括不可枚举属性和Symbol属性)

Object.values

获取一个对象中所有的value值(不包括不可枚举属性和Symbol属性)

const obj = {}
Object.defineProperty(obj, 'a', {Enumerable: false, value: 1})
obj[Symbol()] = 2
obj['b'] = 3

console.log(Object.keys(obj)) // ['b']
console.log(Object.values(obj)) // ['3']
console.log(Object.getOwnPropertyNames(obj)) // ['a', 'b']
console.log(Object.getOwnPropertySymbols(obj)) // [Symbol()]

Object.getOwnPropertyNames

获取一个对象所有属性的key值(包括不可枚举属性,不包括Symbol属性)

const obj = {
  foo: 'bar',
  baz: 43
}
Object.getOwnPropertyNames(obj) // ['foo', 'baz']
Object.getOwnPropertySymbols: 获取一个对象所有Symbol属性
const obj = {}
obj[Symbol('a')] = 'localSymbol'
obj[Symbol.for('b')] = 'globalSymbol'
Object.getOwnPropertySymbols(obj) // [Symbol(a), Symbol(b)]
拓展:Symbol是为了保证对象属性的一致性
const sy = Symbol('a')
const obj = {}
obj[Symbol('a')] = 3  // {Symbol(a): 3}
obj[sy] = 4  // {Symbol(a): 3, Symbol(a): 4}

console.log(obj[Symbol('a')]) // undefined
console.log(obj[sy])  // 4

Object.preventExtensions

使一个对象不再具有拓展性(不能添加新属性)

Object.isExtensible

判断一个对象是否具有拓展性

const obj = {v1: 1} // {v1:1}
obj.v2 = 2  // {v1:1, v2:2}
Object.preventExtensions(obj)
obj.v3 = 3  // {v1:1, v2:2}
obj.v2 = 3  // {v1:1, v2:3}
Object.isExtensible(obj)  // false

hasOwnProperty

判断一个对象是否包含某个属性(不包括原型链上的属性)

const obj = { a: 2 }
obj.hasOwnProperty('a') // true
obj.hasOwnProperty('b') //false
isPrototypeOf: 判断一个对象是否在某个对象的原型链上
function fn() {}
_fn1 = new fn() // fn {}
_fn2 = fn()     // undefined
console.log(fn.isPrototypeOf(_fn1)) // false
console.log(fn.prototype.isPrototypeOf(_fn1)) // true
console.log(fn.prototype.isPrototypeOf(_fn2)) // false
console.log(Object.prototype.isPrototypeOf(_fn1)) // true
console.log(Object.prototype.isPrototypeOf(_fn2)) // false
posted @ 2020-01-17 14:19  清梦徐徐丶莫  阅读(402)  评论(0编辑  收藏  举报