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
newobj1
和 newobj2
的原型链大致如下:
newobj1 --> obj1 --> Object.prototype
newobj2 -----------> Object.prototype
property
Object.create
定义属性,Object.assign
只是分配属性。分配属性时,会创建一个 Configurable
、Enumerable
、Writable
都为 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 }, 注意目标对象自身也会改变。
参考资料: