一文搞懂Object相关API

最近在精度《你不知道的js》这本书,对里面提到到Object相关的API,感到有点陌生,也不容易记忆。趁着周末时间,好好的梳理了一把,今后再遇到相关的操作,再也不恐惧了。

1.Object.defineProperty定义对象的单个属性

Object.prototype.lastName = 'yin'
const father = {
    name: '老张',
    age: 60,
    [Symbol('foo')]: 100,
}
// 1. Object.defineProperty定义对象的单个属性
Object.defineProperty(father, 'money', {
    value: 1000,
    writable: true,
    configurable: true,
    enumerable: true
})
console.log(father) // { name: '老张', age: 60, money: 1000, [Symbol(foo)]: 100 }

2. Object.create() 创建子对象

// 2. Object.create() 创建子对象
const son = Object.create(father)
console.log(son.money) // 1000
son.name = '小张'
son.age = 20
son[Symbol('bar')] = 'bar'

3. Object.defineProperties 定义多个属性

// 3. Object.defineProperties 定义多个属性
Object.defineProperties(son, {
    'money': {
        value: 0,
        writable: true,
        configurable: true,
        enumerable: false
    },
    'car': {
        value: 'BMW',
        writable: true,
        configurable: true,
        enumerable: true
    }

})
console.log(son.money) // 0

4. Object.keys() 对象的可枚举属性组成的数组(不含Symbol)

// 4. Object.keys() 对象的可枚举属性组成的数组(不含Symbol)
const objArr = Object.keys(son)
console.log(objArr) // [ 'name', 'age', 'car' ]

5.Object.entries() 返回一个给定对象自身可枚举属性的键值对数组(不含Symbol)

// 5.Object.entries() 返回一个给定对象自身可枚举属性的键值对数组(不含Symbol)
for (const [key, value] of Object.entries(son)) {
    console.log(`${key}: ${value}`);// name: 小张
                                    // age: 20
                                    // car: BMW
}
console.log(Object.entries(son)) // [ [ 'name', '小张' ], [ 'age', 20 ], [ 'car', 'BMW' ] ]

6. Object.getOwnPropertyDescriptor() 方法返回指定对象上一个自有属性对应的属性描述符。

// 6. Object.getOwnPropertyDescriptor() 方法返回指定对象上一个自有属性对应的属性描述符。
const descriptor1 = Object.getOwnPropertyDescriptor(son, 'car');
console.log(descriptor1) // { value: 'BMW', writable: true, enumerable: true, configurable: true }

7. Object.getOwnPropertyDescriptors() 方法用来获取一个对象的所有自身属性的描述符。

// 7. Object.getOwnPropertyDescriptors() 方法用来获取一个对象的所有自身属性的描述符。
const descriptors = Object.getOwnPropertyDescriptors(son)
console.log(descriptors)
// { name:
//     { value: '小张',
//       writable: true,
//       enumerable: true,
//       configurable: true },
//    age:
//     { value: 20,
//       writable: true,
//       enumerable: true,
//       configurable: true },
//    money:
//     { value: 0,
//       writable: true,
//       enumerable: false,
//       configurable: true },
//    car:
//     { value: 'BMW',
//       writable: true,
//       enumerable: true,
//       configurable: true } ,
//  [Symbol(bar)]:
//      { value: 'bar',
//          writable: true,
//          enumerable: true,
//          configurable: true }
// }

8. Object.getOwnPropertyNames()方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组

// 8. Object.getOwnPropertyNames()方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组。
const sonNames = Object.getOwnPropertyNames(son)
console.log(sonNames) // [ 'name', 'age', 'money', 'car' ]

9. Object.getOwnPropertySymbols() 方法返回一个给定对象自身的所有 Symbol 属性的数组

// 9. Object.getOwnPropertySymbols() 方法返回一个给定对象自身的所有 Symbol 属性的数组
const ownSymbols = Object.getOwnPropertySymbols(son)
console.log(ownSymbols) // [ Symbol(bar) ]

10. Object.getPrototypeOf() 方法返回指定对象的原型(内部[[Prototype]]属性的值)

// 10. Object.getPrototypeOf() 方法返回指定对象的原型(内部[[Prototype]]属性的值)
const sonPrototype = Object.getPrototypeOf(son)
console.log(sonPrototype)// { name: '老张', age: 60, money: 1000, [Symbol(foo)]: 100 }

11. Object.setPrototypeOf() 方法设置一个指定的对象的原型 ( 即, 内部[[Prototype]]属性)到另一个对象或 null 

// 11. Object.setPrototypeOf() 方法设置一个指定的对象的原型 ( 即, 内部[[Prototype]]属性)到另一个对象或  null。
const grentson = {}
Object.setPrototypeOf(grentson,son)
console.log(grentson.name) // 小张  关系性能 推荐使用 Object.create()

12. isPrototypeOf() 方法用于测试一个对象是否存在于另一个对象的原型链上

// 12. isPrototypeOf() 方法用于测试一个对象是否存在于另一个对象的原型链上
console.log(father.isPrototypeOf(grentson)) // true

13. propertyIsEnumerable() 方法返回一个布尔值,表示指定的属性是否可枚举

// 13. propertyIsEnumerable() 方法返回一个布尔值,表示指定的属性是否可枚举。
console.log(son.propertyIsEnumerable('money')) // false

14. hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)

// 14. hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)。
console.log(son.hasOwnProperty('money')) // true (不可枚举的属性)
console.log(son.hasOwnProperty('Symbol(bar)')) // false (Symbol定义的属性)

15. Object.preventExtensions()方法让一个对象变的不可扩展,也就是永远不能再添加新的属性

// 15. Object.preventExtensions()方法让一个对象变的不可扩展,也就是永远不能再添加新的属性。
const obj = {
    age: 18
}
Object.preventExtensions(obj)
obj.name = 'lp'
console.log(obj) // {age: 18} 

16. Object.seal()方法封闭一个对象,阻止添加新属性并将所有现有属性标记为不可配置。当前属性的值只要原来是可写的就可以改变。

原理 会在现有对象上调用Object.preventExtensions() 并设置 confingurable: false

// 16. Object.seal()方法封闭一个对象,阻止添加新属性并将所有现有属性标记为不可配置。当前属性的值只要原来是可写的就可以改变。
// 原理 会在现有对象上调用Object.preventExtensions() 并设置 confingurable: false
const object1 = {
    name: 'lp'
}
Object.seal(object1)
console.log(delete object1.name) // false
object1.name = 'LIPENG'
object1.age = 26
console.log(object1) // { name: 'LIPENG' }

17. Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;

冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。

 freeze() 返回和传入的参数相同的对象。

原理 在现有对象上调用Object.seal() 对象,并把数据的‘数据访问’属性标记为 writable: false

// 17. Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;
// 冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。
// freeze() 返回和传入的参数相同的对象。
// 原理  在现有对象上调用Object.seal() 对象,并把数据的‘数据访问’属性标记为 writable: false
const object2 = {
    name: 'lp'
}
Object.freeze(object2)
console.log(delete object2.name) // false
object2.name = 'LIPENG'
object2.age = 26
console.log(object2) // { name: 'lp' }

18. Object.is() 方法判断两个值是否为同一个值

// 18. Object.is() 方法判断两个值是否为同一个值
console.log(Object.is(+0,-0)) // false
console.log(+0 == -0) // true
console.log(Object.is(NaN,NaN))// true

 19. Object.isExtensible() 方法判断一个对象是否是可扩展的(是否可以在它上面添加新的属性)。

20. Object.isSealed() 方法判断一个对象是否被密封。

21. Object.isFrozen()方法判断一个对象是否被冻结。

22. toLocaleString() 方法返回一个该对象的字符串表示。此方法被用于派生对象为了特定语言环境的目的(locale-specific purposes)而重载使用

const obj1 = {
    name: 'lipeng',
    sex: 'man',
    skill: {
        js: 80,
        css: 86,
        html: 87
    }
}
console.log(Object.toLocaleString(obj1)) // function Object() { [native code] }

23. Object.values()方法返回一个给定对象自身的所有可枚举属性值的数组,值的顺序与使用for...in循环的顺序相同 ( 区别在于 for-in 循环枚举原型链中的属性 )

// 23. Object.values()方法返回一个给定对象自身的所有可枚举属性值的数组,值的顺序与使用for...in循环的顺序相同 ( 区别在于 for-in 循环枚举原型链中的属性 )。
console.log(Object.values(son)) // [ '小张', 20, 'BMW' ] 不包含不可枚举和Symbol

24. for ... in .. (包含原型链上的可枚举属性)

for (const key in son) {
    console.log(key, son[key])
} 
// name 小张
// age 20
// car BMW
// lastName yin

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值