两者都是用来创建一个新的对象,都是常用方法,
但是存在一定的差异。
newObj = Object.create(obj, [propertiesObj])
该方法的核心并不是创建对象newObj,
而是通过该方法,可以在新对象newObj和初始的obj对象之间,建立一条原型链:
newObj.__proto__ = obj
或者创建一个纯净的空对象。
有两个参数,
第一个参数是一个初始对象,也可以是null,
第二个参数是可选的,它和Object.defineProperties方法的第二个参数相同。
它会返回一个新的对象,
当省略第二个参数时,新对象是一个空对象,它的__proto__指向初始对象,
var a = { num: 1 };
var b = Object.create(a);
console.log('b: ', b);
结果如下:

b是一个空对象,但是b可以获取到num的值。
b是如何获取到num的值呢?
b是通过原型链查找到a的num值,然后获取到了num的值。
也就是说,Object.create并不是直接把num的值给了b,
而是在b和a之间建立了一条原型链,b可以通过原型链去获取到a里的属性和值。
既然如此,如果此时修改a的num值,b.num的值也会跟着变化,来验证一下:
a.num = 2;
console.log('a.num: ', a.num, '\n', 'b.num: ', b.num);

那么,反过来讲,b也可以通过原型链修改a中的num值,继续验证:
b.__proto__.num = 3;
console.log('a.num: ', a.num, '\n', 'b.num: ', b.num);

毫无意外,a和b的num值都发生了变化。
b通过原型链去修改了a的num值,于是a.num就变成了3
然后b又通过原型链去查找a中的num值,于是b.num也是3
如果初始对象是null,那么新对象就是一个纯净的空对象,
新对象没有从Object中继承任何属性和方法,也没有加入任何原型链。
先来看下一个普通对象是什么样子:
var a = { num: 1 };
console.log(a);
console.log(a.__proto__);
console.log(a.__proto__ === Object.prototype);

可以看到普通对象会从Object中继承很多方法。
普通对象的__proto__指向Object.prototype
再来看下参数为null时创建的新对象:
var a = Object.create(null);
console.log(a);
console.log(a.__proto__);

这里的新对象a,没有继承任何方法,也没有原型链。
该方法还有第二个参数,可以参照Object.properties方法的第二个参数。
用来给新对象添加额外的属性和方法。
举个例子:
var a = { num: 1 };
var b = Object.create(a, {
'name': {
configurable: true,
enumerable: true,
value: 'dilireba',
writable: true,
},
'age': {
value: 18
},
'sex': {
value: 0
}
})
console.log('b: ', b);
查看打印结果:

该方法用于生成一个普通对象。
生成的新对象继承了Object的方法,并且处于原型链中。
var a = new Object();
console.log('a: ', a);
console.log(a.__proto__ === Object.prototype);
