一起来学习一下new Object 和 Object.create,先贴一个代码来看一下输出结果。
let obj1 = Object.create({x:1}); //obj1 = {}
let obj2 = new Object({x:1}); // obj2 = {x: 1}
可以明显的看到结果完全不一样,说好都是创建一个对象的呢。那先来看一下Object.create到底是做了什么。
Object.create
MDN官方定义: Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的proto。
换个比较容易理解的说法:将现有的对象指定为原型proto,及其属性propertiesObject去创建一个新的对象。
Object.create接受两个参数,即object.create(proto, propertiesObject)
proto
: 现有的对象,即新对象的原型对象(新创建的对象proto将指向该对象)。如果proto
为null
,那么创建出来的对象是一个{}
并且没有原型。
image.png
propertiesObject
:可选,给新对象添加新属性以及描述器。如果没有指定即创建一个{}
,有原型也有继承Object.prototype上的方法。可参考 Object.defineProperties() - mdn 的第二个参数。
实现一个自己的object.create
function myCreate(proto,properties){
//新对象
var fn = function() { };
fn.prototype = proto;
if(properties){
//defineProperties 在新对象上定义新的属性或修改现有属性
Object.defineProperties(fn, properties)
}
return new fn();
}
new Object()
new
创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。
new 关键字会进行如下的操作
-
创建一个空的简单JavaScript对象(即{});
-
链接该对象(即设置该对象的构造函数)到另一个对象 ;
-
将步骤1新创建的对象作为this的上下文 ;
-
如果该函数没有返回对象,则返回this。
-
new
会创建一个新对象,并且这个新对象继承构造函数的prototype,也就是说创建的实例的proto指向构造函数的prototype -
new Object()
会创建一个实例,该实例的proto指向Object的prototype
区别
- new Object()继承内置对象Object,Object.create继承指定对象
- 可以通过Object.create(null) 创建一个干净的对象,也就是没有原型,而 new Object() 创建的对象是 Object的实例,原型永远指向Object.prototype.
网友评论