Object.create()的语法:
Object.create(proto[, propertiesObject])
1.proto
:新创建对象的原型对象。
2.propertiesObject
:可选。如果没有指定则为undefined
,则是要添加到新创建对象的不可枚举(默认)属性(即其自身定义的属性,而不是其原型链上的枚举属性)对象的属性描述符以及相应的属性名称。这些属性对应Object.defineProperties()
的第二个参数。举个栗子:
var obj = { a:1 } var o = Object.create(obj,{ b:{ value:2, enumerable:true } }) console.log(o.__proto__) //{a:1} console.log(o) // {b:2}
这里有两点需要注意:
1.如果Object.create()的第二个参数不为空,则属性的enumerable需要设置为true(该描述符默认是false),否则b不会出现在o里
var obj = { a:1 } var o = Object.create(obj,{ b:{ value:2 } }) console.log(o.__proto__) //{a:1} console.log(o) // {}
2.以上例为例,Object.create()的结果是,把o的原型指向其第一个参数。也就是o的原型指向obj,而不是o指向obj
Object.assign()语法
Object.assign(target, ...sources)
1.target
:目标对象。
2.sources
:源对象,可以是一个列表形式只会拷贝源对象自身的并且可枚举的属性到目标对象。它将返回目标对象。 可以实现浅拷贝
const o1 = { a: 1 }; const o2 = { b: 2 }; const o3 = { c: 3 }; const obj = Object.assign(o1, o2, o3); console.log(obj); // { a: 1, b: 2, c: 3 } console.log(o1); // { a: 1, b: 2, c: 3 }, 注意目标对象自身也会改变。
需要注意的是:
1.继承属性和不可枚举属性不能拷贝
const obj = Object.create({foo: 1}, { // foo 是个继承属性。 bar: { value: 2 // bar 是个不可枚举属性。 }, baz: { value: 3, enumerable: true // baz 是个自身可枚举属性。 } }); const copy = Object.assign({}, obj); console.log(copy); // { baz: 3 }
先使用Object.create()将obj的原型指向了{foo:1},则obj继承了{foo:1},使用Object.assign()将obj拷贝给空对象,那么{foo:1}作为继承的属性不会被拷贝过去。
2.拷贝的是属性值。假如源对象的属性值是一个对象的引用,那么它也只指向那个引用。即它不能深拷贝