Object.create 和 Object.assign

Object.create(proto, [propertiesObject]) 方法创建一个新对象,并且把 proto 设置为新对象的原型对象,propertiesObject 为可选参数,这个参数和JavaScript数据属性和访问器属性博客中 Object.defineProperty() 方法的第三个参数格式相同,如果提供了这个参数,那么将会给新对象添加指定的属性和对应的属性描述符。

Object.assign(target, ...sources) 方法用于将所有可枚举属性的值从一个或多个源对象分配到目标对象。它将返回分配属性后的目标对象。

let obj1 = {}, obj2 = {};
let newobj1 = Object.create(obj1, {name: {value: 'Tom'}});
let newobj2 = Object.assign(obj2, {name: 'Tom'});

原型链

Object.create 使用指定的 [[Prototype]] 创建一个新对象,Object.assign 直接在指定对象上分配属性

console.log(newobj1 === obj1);	//false
console.log(newobj2 === obj2);	//true

console.log(obj1.isPrototypeOf(newobj1));	//true
console.log(obj2.isPrototypeOf(newobj2));	//false

newobj1newobj2 的原型链大致如下:

newobj1 --> obj1 --> Object.prototype
newobj2 -----------> Object.prototype

property

Object.create 定义属性,Object.assign 只是分配属性。分配属性时,会创建一个 ConfigurableEnumerableWritable 都为 true 的属性;定义属性时,你可以指定这些属性,但默认情况下这三个属性的值都为 false

console.log(Object.getOwnPropertyDescriptor(newobj1, 'name'));
//{value: 'Tom', writable: false, enumerable: false, configurable: false}
console.log(Object.getOwnPropertyDescriptor(newobj2, 'name'));
//{value: 'Tom', writable: true, enumerable: true, configurable: true}

实例

Object.create

原型式继承

var person = {
	name: "Tom",
	colors: ["white", "black"]
};
var anotherPerson = Object.create(person, {
	name: {
		value: "Jerry"
	}
});
alert(anotherPerson.name);		//"Jerry"
Object.assign

浅拷贝(只复制对象的第一层属性)

const obj = { a: 1 };
const copy = Object.assign({}, obj);
console.log(copy); // { a: 1 }

合并对象

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 }, 注意目标对象自身也会改变。

参考资料:

stackoverflowObject.createObject.assign