1.Object.getPrototypeOf()
Object.getPrototypeOf()方法返回参数对象的原型。
// 空对象的原型是Object.prototype
Object.getPrototypeOf({}) === Object.prototype // true
// Object.prototype的原型是null
Object.getPrototypeOf(Object.prototype) === null // true
2.Object.setPrototypeOf()
Object.setPrototypeOf()方法为参数对象设置原型,返回该参数对象。它接受两个参数,第一个是现有对象,第二个是原型对象。
let a = {}
let b = {c: 1}
// 将对象a的原型设置为对象b
let temp = Object.setPrototypeOf(a, b)
console.log(Object.getPrototypeOf(a) === b) // true
3.Object.create()
Object.create()方法接受一个对象作为参数,然后以它为原型,返回一个实例对象。该实例完全继承原型对象的属性。
let A = {
print() {
console.log('hello')
}
}
let B = Object.create(A)
console.log(Object.getPrototypeOf(B) === A) // true
B.print() // hello
上面代码中,Object.create()方法以对象A为原型,生成了对象B,B继承了A的所有属性和方法。
4.Object.prototype.isPrototypeOf()
用来判断该对象是否为参数对象的原型
let o1 = {};
let o2 = Object.create(o1);
let o3 = Object.create(o2);
console.log(o2.isPrototypeOf(o3)) // true
console.log(o1.isPrototypeOf(o3)) // true
5.Object.getOwnPropertyNames()
Object.getOwnPropertyNames()方法返回一个数组,成员是参数对象本身的所有属性的键名,不包含继承的属性键名。
Object.getOwnPropertyNames(Date)
// ['length', 'name', 'prototype', 'now', 'parse', 'UTC']
6.Object.prototype.hasOwnProperty()
对象实例的hasOwnProperty方法返回一个布尔值,用于判断某个属性定义在对象自身,还是定义在原型链上。
let obj = { total: 30}
console.log(obj.hasOwnProperty('total')) // true
console.log(obj.hasOwnProperty('toString')) // false
7.Object.is()
用来比较两个值是否严格相等
console.log(Object.is('5', 5)) // false
console.log(Object.is('zh', 'zh')) // true
8. Object.assign()
Object.assign()方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。
let target = {}
let source1 = {a: 1}
let source2 = {b: 2}
Object.assign(target,source1,source2)
target // {a: 1, b: 2}
9.Object.keys()
Object.keys()返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历属性的键名。
let obj = {
name: 'zhang',
age: 30,
address: 'zhengzhou'
}
console.log(Object.keys(obj)) // ['name', 'age', 'address']
10.Object.values()
Object.values()返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历属性的键值。
let obj = {
name: 'zhang',
age: 30,
address: 'zhengzhou'
}
console.log(Object.values(obj)) // ['zhang', 30, 'zhengzhou']
11.Object.entries()
Object.entries()返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值对数组。
let obj = {
name: 'zhang',
age: 30,
address: 'zhengzhou'
}
console.log(Object.entries(obj))
// [['name', 'zhang'], ['age', 30],['address', 'zhengzhou']]
12.Object.defineProperty()
Object.defineProperty(obj,prop,descriptor)
obj: 要定义属性的对象
prop: 要定义或修改的属性的名称
descriptor:要定义或修改的属性描述符
方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。
let obj = {}
Object.defineProperty(obj,'age', {
configurable: true,
enumerable: true,
value: 30,
writable: false
})
console.log(obj) // {age: 30}
obj.age = 20 // 严格模式下把报错 以为writable为false,该属性为只读,不可更改
13.Object.freeze()
Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。
let obj = {age: 30}
Object.freeze(obj)
obj.age = 20
// 严格模式下报错
// Uncaught TypeError: Cannot assign to read only property 'age' of object
14.Object.seal()
Object.seal()方法封闭一个对象,阻止添加新属性并将所有现有属性标记为不可配置。当前属性的值只要原来是可写的就可以改变。
let obj = {age: 30}
Object.seal(obj)
obj.name = 'zhang'
// 报错 Uncaught TypeError: Cannot add property name, object is not extensible