• [ js ] -- Object.create()和new Object()



    简述

    两者都是用来创建一个新的对象,都是常用方法,

    但是存在一定的差异。


    Object.create

    语法:

    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);
    

    查看打印结果:
    在这里插入图片描述


    new Object

    该方法用于生成一个普通对象。

    生成的新对象继承了Object的方法,并且处于原型链中。

    var a = new Object();
    console.log('a: ', a);
    console.log(a.__proto__ === Object.prototype);
    

    在这里插入图片描述


  • 相关阅读:
    java毕业生设计校园绿化管理系统计算机源码+系统+mysql+调试部署+lw
    C#应用程序界面开发基础——窗体控制(4)——选择类控件
    Impagliazzo five-worlds
    Java:实现FibonacciHeap数据结构算法(附完整源码)
    小马识途谈百科词条创建如何顺利通过审核?
    【华为OD机试】分苹果
    设计模式-建造者模式
    trino on yarn
    打patch 命令
    【计算机网络】第一章——概述
  • 原文地址:https://blog.csdn.net/tuzi007a/article/details/127103602