一、 Object.assign()
拷贝一个对象属性到另一个对象,有相同属性则会覆盖,后面覆盖前面的属性
拷贝对象中的普通数据类型,不可拷贝引用类型,如对象中的对象
即拷贝普通数据类型:改变原对象和新对象的值不会相互影响
不可深拷贝:即为拷贝对象中的对象时,改变原对象的该值,新对象也会受影响,只是拷贝了原对象的引用地址而已,所以会相互影响
var target = {a:1,b:2}
var obj2 = {a:5, c:2}
var obj3 = {d:5}
var obj4 = {a:10, b:{c:'你好'}}
Object.assign(target, obj2, obj3)
console.log('target', target) // {a:5,b:2,c:2,d:5}
var target2 = Object.assign({}, obj4)
console.log('不可深拷贝', target2) // {a:10, b:{c:'你好'}}
// 深拷贝,枚举数据和引用数据改变相互都不受影响
var target3 = JSON.parse(JSON.stringify(obj4))
obj4.b.c = 'Hello'
obj4.a = 20
console.log('target3',target3) // {a:10, b:{c:'你好'}}
console.log('obj4',obj4) // {a:20, b:{c:'Hello'}}
**
二、Object.create()
创建一个新对象
**
var o = Object.create(null)
console.log('创建无原型对象o',o) // {}
var o1 = {}
// 字面量创建对象方式相当于下面这种方式
var o2 = Object.create(Object.prototype)
console.log('创建原型对象o',o2)
// 以空对象为原型,创建带有n属性的新对象,且创建的属性不可写,不可枚举,不可配置(默认都为false)
var o3 = Object.create({},{n: {value: 20}})
o3.n = 100 // 不可改
console.log('以空对象为原型,创建带有n属性的新对象', o3) // {n:20}
// 创建一个可写可枚举,可配置的对象
var o4 = Object.create({},{
p: {
value:20,
writable: true,
enumerable: true,
configurable: true
}
})
o4.p = 50
console.log('o4', o4) // {p:50}
**
三、Object.defineProperty()
定义一个对象的一个属性和修改一个对象的一个属性
**
Object.defineProperties()定义一个对象的多个属性和修改一个对象的多个属性
var d = {}
Object.defineProperty(d, 'name', {
value: '张三',
writable: true,
enumerable: true,
configurable: true
})
console.log('ddd', d) // {name: '张三'}
**
四、Object.getOwnPropertyDescriptor()
返回指定对象上一个自有属性对应的属性描述符
**
Object.getOwnPropertyDescriptors() 获取对象所有属性的描述符
const object2 = {
p: 42
}
const descriptor1 = Object.getOwnPropertyDescriptor(object2, 'p')
console.log(descriptor1.configurable) // true
// 区别于Object.assign()只能拷贝对象自身枚举属性,无法拷贝原型和属性描述
var g1 = {a:1,b:{c:'你好'}}
var g2 = Object.create(
// 返回指定对象的原型
Object.getPrototypeOf(g1),
Object.getOwnPropertyDescriptors(g1)
)
console.log('g22', g2) // {a:1,b:{c:'你好'}}
var g3 = Object.assign({},g1)
console.log('g33', g3) // {a:1,b:{c:'你好'}}
**
五、Object.freeze()
**
冻结一个对象或者数组,使之不可被修改,不能添加属性和删除属性,不可修改可枚举性,可配置性,可写性
var f0 = {
a:1,
b:20
}
var f = Object.freeze(f0)
console.log(f===f0) // true
console.log(Object.isFrozen(f)) // true