首页 > 其他分享 >五分钟快速理解new操作符

五分钟快速理解new操作符

时间:2024-09-05 10:51:14浏览次数:6  
标签:function return name age 数据类型 五分钟 操作符 new

五分钟快速理解new操作符

(1)new操作符做了哪些事情(4步)

  • 新建一个新的空对象{}

  • 让空对象的__proto__和构造函数的prototype建立链接

    {
      _proto:Person.prototype
    }
    
  • 改变this指向,让构造函数中的this指向这个新的对象

    {
      _proto:Person.prototype,
      age:11,
      name:"jack",
      ...
    }
    
  • 对构造函数的返回值类型进行判断
    如果返回值类型为基本数据类型(不返回值相当于return undefined),new 操作符会返回新创建的对象实例;
    如果返回值类型是引用数据类型,则该引用数据会成为 new 表达式的结果,而新创建的对象实例会被丢弃;

(2)代码示例

  • 不返回数据

    function Person1(age,name){
      this.age=age;
      this.name=name;
      //不返回值相当于return undefined
    }
    let person1=new Person1(11,"jack");
    console.log(person1)//{age: 11, name: 'jack'}
    
  • 返回基本数据类型

    function Person2(age,name){
      this.age=age;
      this.name=name;
      return 12;//基本数据类型
    }
    let person2=new Person2(16,"mike");
    console.log(person2)//{age: 16, name: 'mike'}
    
  • 返回引用数据类型

     function Person3(age,name){
       this.age=age;
       this.name=name;
       return [1,2,3];//引用数据类型
     }
     let person3=new Person3(18,"jmy");
     console.log(person3)//[1, 2, 3]
    
     function Person4(age,name){
       this.age=age;
       this.name=name;
       return {age:1,name:"chourunfat"};//引用数据类型
     }
     let person4=new Person4(20,"bob");
     console.log(person4)//{age: 1, name: 'chourunfat'}
    

(3)手写new标识符

  • 封装new标识符

    function customNew(func,...params){
      //新建一个空对象
      let obj={};
      //将空对象的原型和构造函数的原型连接起来
      Object.setPrototypeOf(obj,func.prototype)
      //改变this执行
      let result=func.call(obj,...params)
      return result instanceof Object ? result : obj;
    }
    
  • 测试使用

    function func1(a,b,c){
       this.a=a;
       this.b=b;
    }
    const obj1= customNew(func1,1,2,3);
    console.log(obj1)//{a: 1, b: 2}
    function func2(a,b,c){
      this.a=a;
      this.b=b;
      return {
        name:"111"
      }
    }
    const obj2= customNew(func2,1,2,3);
    console.log(obj2)//{name: '111'}
    

标签:function,return,name,age,数据类型,五分钟,操作符,new
From: https://blog.csdn.net/fageaaa/article/details/141924289

相关文章

  • 每天五分钟深度学习:广播机制(以python语言为例)
    本文重点因为向量化的计算方式导致效率的提升,所以现在很多时候,我们都是用向量化的计算,但是向量化计算有一个问题让人头痛就是维度的问题,本节课程我们将讲解python中的广播机制,你会发现这个机制的优秀之处。代码实例importnumpyasnpa=np.random.randn(3,4)b=np.random.r......
  • 《C++编程规范》四、函数与操作符
    目录第25条正确地选择通过值、(智能)指针或者引用传递参数第25条正确地选择通过值、(智能)指针或者引用传递参数正确选择参数:分清输入参数、输出参数和输入/输出参数,分清值参数和引用参数。正确地传递参数。选择如何传递参数时,应该遵循以下准则。对于只输入(input-only)参数:始......
  • 解决podman: ERRO[0000] running newuidmap: write to uid_map failed: Invalid argum
    报错ERRO[0000]running/usr/bin/newuidmap27115520100011100000655366553710000065537:newuidmap:writetouid_mapfailed:InvalidargumentError:cannotsetupnamespaceusing"/usr/bin/newuidmap":shouldhavesetuidorhavefilecapssetu......
  • C++成员变量的new操作不应该放在构造函数中
    C++成员变量的new操作不应该放在构造函数中:理由如下:https://blog.csdn.net/lmb1612977696/article/details/77850378#:~:text=C++%E7%B1%BB%E4%B8%AD%E7%9A%84构造函数中尽量不要有new的操作,new的操作可以定义一个Init()来单独处理,代码如下:1classTest{2public:3......
  • malloc/free 和 new/delete的区别
    malloc/free和new/delete是C++中两种不同的动态内存管理方法,它们有一些关键的区别:1.内存分配和释放机制malloc和free:函数:malloc是一个C标准库函数,用于从堆中分配指定大小的原始内存块。它返回一个void*指针,指向分配的内存块的起始位置。free用于释放由......
  • 结构体如何使用指针呢?两种方法,第一种是静态内存管理,不能用delete回收内存。第二种,使用
    问题描述:根据下列代码和结果回答下列问题。代码://Createdby黑马程序员.#include"iostream"usingnamespacestd;intmain(){structStudent{stringname;intage;stringgender;};//先创建一个标准的结构体对象(......
  • 【C++】类和对象2:默认成员函数+操作符重载
    本篇是类和对象的第二站......
  • 探索Groovy的Elvis操作符及其在Java中的替代方案
    在编程的世界里,我们经常需要处理变量的默认值问题,尤其是在变量可能为null的情况下。Groovy语言提供了一种优雅的方式来处理这种情况,那就是Elvis操作符。本文将探讨Elvis操作符的用法,并展示如何在Java中实现类似的功能。Elvis操作符简介Elvis操作符(?:)是Groovy语言中的一种......
  • kimi:如何分析是哪个接口调用了最多次的operator new[]接口?
    如何分析是哪个接口调用了最多次的operatornew[]接口?重载operatornew[]:你可以在你的程序中重载operatornew[],记录每次调用时的调用栈信息。#include<iostream>#include<fstream>#include<new>#include<cstdlib>#include<execinfo.h>//包含backtrace函数#inc......
  • What's new in PikiwiDB(Pika) v3.5.5
    尊敬的社区朋友及PikiwiDB(Pika)用户们:非常高兴地宣布---PikiwiDB(Pika)【下文简称Pika】长期维护版本v3.5的最新版本---v3.5.5今天正式发布。在这个版本中,除了修复所有已知的主从复制bug外,通过引入RTC特性其性能又有了大幅度提升,且主从failover机制兼容了Redis-Se......