首页 > 其他分享 >Object.create与new操作符

Object.create与new操作符

时间:2023-04-18 12:45:54浏览次数:30  
标签:const 对象 create Object obj new 构造函数

前言

Object.create与new都可以用来生成一个对象,那么它们之间有什么区别和联系呢

分析

  1. 先看一下用法,很明显可以看出,new是生成一个基于构造函数生成一个新对象,而Object.create是基于某个对象,将这个对象作为原型链实现的一个新的空对象。
function O(a) {
  this.a = a;
}
const obj = new O(1); // { a: 1, [[Prototype]]: { constructor: f O(a), ... } }
const obj_new = Object.create(obj); // { [[Prototype]]: { a: 1, [[Prototype]]: { constructor: f O(a), ... } } }
  1. 从原理上来看,他们都存在一个原型链的继承,但是使用的场景和接受的对象是不太一致的。new是作用于一个构造函数,Object.create接受一个将要被当做原型链的函数,最终得到的结果前者是一个已经初始化过后可能存在值的对象,但是后者肯定是个空对象。

  2. 接下来来模拟一下这两个方法的实现。

const my_new = function(fn, ...args) {
    const obj = {}; // 创建一个空对象
    const result = fn.apply(obj, args); // 把空对象当做this执行构造函数
    obj.__proto__ = fn.prototype; // 把空对象的原型链指向构造函数
    if (result) { // 判断是否构造函数已经有返回值,有就返回该构造函数的返回值
        return result;
    } 
    return obj; // 没有就把新生成的对象返回
}
const my_create = function (obj) {
    const F = function() {}; // 构建一个空的构造函数
    F.prototype = obj; // 将构造函数的原型链指向目标对象
    return my_new(F); // 返回该构造函数生成的新对象
}
const obj = my_new(O, 1); // { a: 1, [[Prototype]]: { constructor: f O(a), ... } }
const obj_new = my_create(obj); // { [[Prototype]]: { a: 1, [[Prototype]]: { constructor: f O(a), ... } } }

小结

两者都体现了js的原型链继承的特点,只不过分别继承的对象不太一致,一个是原型链继承构造函数,一个是原型链继承目标对象,仅此而已。

标签:const,对象,create,Object,obj,new,构造函数
From: https://www.cnblogs.com/aloneMing/p/17329165.html

相关文章

  • Oracle create index 中途取消后应该如何处理
        有时会遇到这样的情况,在创建索引的过程中啪叽网断了,会话中断;或者创建索引时觉得执行太慢,直接按了crtl+c取消,直接把运行窗口关了...尝试重新建索引的时候会遇到报错ORA-00095索引名已存在,而dropindex时又报错ORA-08104 thisindex isbeingonlinebuiltorrebuilt......
  • java如何将JSONObject转成实体对象
    importcom.google.gson.Gson;importorg.json.JSONObject;//...JSONObjectjson=newJSONObject("{\"name\":\"JohnSmith\",\"age\":30}");Gsongson=newGson();Personperson=gson.fromJson(json.toString()......
  • Java-Day-10(Object 常用类 + JDK 源码 + 断点调试)
    Java-Day-10Object常用类equals方法==与equals==是一个比较运算符既可以判断基本类型,又可以判断引用类型如果判断基本类型,判断的是值是否相等如果判断引用类型,判断的就是地址是否相同,即判断是否是一个对象equals是Object类中的方法,只能判断引用类型默认......
  • React redux toolkit: Uncaught Error:[Immer] An immer producer returned a new...
    React在写一个购物车的reduxtoolkit时遇到了问题。核心代码如下:import{createSlice}from"@reduxjs/toolkit";constcartSlice=createSlice({name:'cart',initialState:{cartItems:[],cartItemCount:0},reducers:{......
  • ArcPy 批处理之 [ hdf转tif ]; [ Con函数 ]; 镶嵌至新栅格 [ Mosaic to New Raster ];
    一、 ArcPy批量将文件夹内的*.hdf文件转为*.tif 文件:#encoding:utf-8 ##hdf2tifimportarcpyimportosinPath=r'E:\Data\S00_DataHdf\\'outPath=r'E:\Data\S01_DataTif\\'fordirpath,dirnames,filenamesinos.walk(inPath):......
  • 01-Object、常用API
    01-Object类、常用APIObject类概述在Java中,Object类是所有类的根类,它位于Java类继承体系的最顶层。所有的Java类都直接或间接地继承了Object类,因此Object类中包含了一些在Java编程中非常常用的方法。常用方法以下是一些Object类中常用的方法:equals(Objectobj)publicbool......
  • 论文解读《Automatically discovering and learning new visual categories with rank
    论文信息论文标题:Automaticallydiscoveringandlearningnewvisualcategorieswithrankingstatistics论文作者:K.Han, Sylvestre-AlviseRebuffi, SébastienEhrhardt, A.Vedaldi, AndrewZisserman论文来源:ICLR2020论文地址:download 论文代码:download视屏讲解:clic......
  • in pyvis I always get this error: "AttributeError: 'NoneType' object has no attr
    inpyvisIalwaysgetthiserror:"AttributeError:'NoneType'objecthasnoattribute'render'"SolutionWheninitializingtheNetwork,Iaddednotebook=True,thisfixedtheissueforme.Thenewcodeis:frompyvisimportne......
  • JS中Map、WeakMap和Object的区别
    JavaScript中的Map、WeakMap和Object都是用于存储键值对的数据结构:1.Map:Map是一种新的数据结构,它允许使用任何数据类型(包括对象和基本数据类型)作为键。Map的一些特性包括:-保持键的插入顺序:当遍历Map时,键值对会按照插入顺序返回。-键可以是任意类型:与Object不同,Map的键可以......
  • Cannot Create Class
      ......