最近在精度《你不知道的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