首页 > 其他分享 >new Object 和 Object.create的区别

new Object 和 Object.create的区别

时间:2022-11-21 11:36:47浏览次数:42  
标签:proto 对象 创建 create Object new

一起来学习一下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将指向该对象)。如果protonull,那么创建出来的对象是一个{}并且没有原型。

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.

标签:proto,对象,创建,create,Object,new
From: https://www.cnblogs.com/Sultan-ST/p/16910842.html

相关文章

  • CF500F New Year Shopping
    双栈维护插入删除:右加右删。维护一个栈。右加左删。维护两个栈,左边栈删除,右边的栈加入,左边栈为空时将右边栈中的数从顶至底加入,均摊进行\(\mathcalO(n)\)次操......
  • 104:object根类_dir()
    ###object根类object类是所有类的父类,因此所有的类都有object类的属性和方法。我们显然有必要深入研究一下object类的结构。对于我们继续深入学习Python很有好处......
  • php使用form-create、FormBuilder快捷创建表单
    form-create、FormBuilder不用不知道,一用吓一跳!好用还漂亮说明一下,form-create主要是用于前段的,FormBuilder是大神基于form-create写的能够用php写前端表单的,我在B站也简单......
  • L10U6-3-Creating professional objectives
    1ExpressionsStatingobjectivesJob-relatedobjectivesHerearesomeexpressionsforcommunicatingcommonbusinessobjectives(objectives)foremployees.proa......
  • 在java中new一个对象的流程是什么?
    Dogdog=newDog()背后执行过程这个涉及到字节码文件结构,类加载机制,堆,栈的认识等知识点。在执行new的时候可以大致分为二个过程,初始化以及实例化,初始化就是类的加载过程,......
  • 关于newlib中的libgloss和libnosys
    关于newlib中的libgloss和libnosys​​Newlib的构成​​​​libgloss的作用​​​​提供启动代码​​​​提供底层I/O支持​​​​提供底层系统函数​​​​libnosys是什么......
  • python安装报错error: pybind11 2.10+ requires MSVC 2017 or newer
    pip安装paddleocr时报错,提示要2017或更高,c:\users\administrator\appdata\local\temp\pip-build-env-86xs2ijc\overlay\lib\site-packages\pybind11\include\pybind11\det......
  • 【DL论文精读笔记】Object Detection in 20 Y ears: A Survey目标检测综述
    目标检测20年综述(2019)......
  • malloc和new
    C语言中的malloc()和free()malloc//void*malloc(intsize);//malloc向系统申请分配指定size个字节的内存空间。返回类型是void*类型。void*表示未确定类型的指针。......
  • 自定义RedisTemplate<String, Object>
    说明:redisTemplate的keySerializer、hashKeySerializer设置为StringRedisSerializer,valueSerializer、hashValueSerializer设置为**genericJackson2JsonRedisSerializer**......