JavaScript中new关键字调用一个函数

在JavaScript中,new关键字用于创建一个对象的实例。当使用new关键字调用一个函数时,JavaScript会自动执行以下操作:

  1. 创建一个新的空对象。
  2. 将这个新对象的原型(__proto__属性)设置为构造函数的prototype属性。
  3. 将构造函数的this关键字绑定到新创建的对象上。
  4. 执行构造函数中的代码,通常是初始化新对象的属性。
  5. 如果构造函数没有显式返回一个对象,则自动返回新创建的对象。

在您提供的代码中,MyTreeTableConstructr函数被定义为一个构造函数,它返回一个MyTreeTable对象。当使用new关键字调用MyTreeTableConstructr时,JavaScript会执行上述步骤,创建一个新的MyTreeTable对象的实例。

在内存中,new操作符会分配一块新的内存空间来存储新创建的对象。这个对象的属性和方法会被存储在这块内存空间中。同时,对象的原型(__proto__属性)会被设置为构造函数的prototype属性,这意味着对象可以访问构造函数原型上定义的属性和方法。

在指针方面,新创建的对象的__proto__属性会指向构造函数的prototype属性。这是通过JavaScript的原型继承机制实现的,它允许对象继承构造函数原型上的属性和方法。

总结来说,当使用new关键字调用一个构造函数时,JavaScript会在内存中创建一个新的对象,将构造函数的this绑定到这个新对象上,并执行构造函数中的代码来初始化对象的属性。同时,对象的原型会被设置为构造函数的prototype属性,从而实现原型继承。

import { defineComponent } from 'vue';
import { h } from 'vue';import TreeTable from 'primevue/treetable';
import Column from 'primevue/column';//构造函数function MyTreeTableConstructr() {return MyTreeTable;
}const MyTreeTable = defineComponent({
// 定义合法的属性名列表validProperties: ['mytreeData', 'property2', 'property3'],name: 'MyTreeTable',components: {TreeTable,Column},// 接受外部的赋值non_TreetableData_object_param_list:[],setup() {// 定义数据const   non_TreetableData_object_param_list=[{object_Name:'A+B+C+D',id_cases:'用例1',id_param:1,required:1,is_object:true,type:2,desc:'参数描述',children: [{required:1,is_object:false,id_param:2,id_parent:1,object_Name:'A',type:3,desc:'参数描述',rule:{id:1,min_length:1,// 最小长度max_length:65535,// 最大长度desc:'文本域类型规则描述',// 描述}},{required:1,is_object:false,id_param:3,id_parent:1,object_Name:'B',type:4,desc:'参数描述',rule:{id:1,// 业务编号type:1,// 种类:小数max:8,// 最大数值min:-8,// 最小数值precision:2,// 精度desc:'数值类型规则描述',// 描述}},{required:1,is_object:false,id_param:4,id_parent:1,object_Name:'C',type:2,desc:'参数描述',rule:{id:1,// 业务编号type:1,// 种类:小数date_type:1,// 日期格式类型time_type:1,// 时间格式类型max:8,// 最大日期min:-8,// 最小日期precision:2,// 精度desc:'日期类型规则描述',// 描述}},{required:1,is_object:false,id_param:5,id_parent:1,object_Name:'D',type:1,desc:'参数描述',rule:{id:1,default_length:1024,//默认值min_length:1,// 最小长度max_length:65535,// 最大长度special_type:1,// 特殊文本类型desc:'文本类型规则描述',// 描述}},{required:1,is_object:false,id_param:14,id_parent:1,object_Name:'E',type:5,desc:'参数描述',rule:{id:1,file_type:1,// 种类unit:1,// 单位max_length:65535,// 单个文件最大长度allow_type: [1,2,3],// 允许的类型desc:'文件类型规则描述',// 描述}},{required:1,is_object:false,id_param:15,id_parent:1,object_Name:'K',type:6,desc:'参数描述',rule:{id:1,name:'限选框名称',//名称limitedNumber:1,//限选类型:1单选 2多选type:1,// 类型:1文本 2数字desc:'限选类型规则描述',// 描述limitedOptionsList:[{name:'qq',desc: '限选值描述'},{name:'xx',desc: '限选值描述'},{name:'yy',desc: '限选值描述'},]}},{required:1,is_object:false,id_param:16,id_parent:1,object_Name:'H',type:7,desc:'参数描述',rule:{id:1,name:'限选框名称',//名称limitedNumber:1,//限选类型:1单选 2多选type:1,// 类型:1文本 2数字desc:'其他类型规则描述',// 描述}},]},];const transformData=(data)=> {const transform = (arr, parentKey = '') => {return arr.map((item, index) => {const newKey = parentKey? `${parentKey}-${index}` : `${index}`;const newItem = {key: newKey,data: {id_cases: item.id_cases,id_param: item.id_param,object_Name: item.object_Name,type: item.type,desc: item.desc,is_object : item.is_object,required : item.required,rule:item.rule,},children: item.children? transform(item.children, newKey) : []};return newItem;});};return transform(data);};const   treeData = transformData(non_TreetableData_object_param_list);const  displayNameBasedOnId=(typeId)=> {const typeMap = [{name: "文本", id: 1},{name: "日期", id: 2},{name: "文本域", id: 3},{name: "数值", id: 4},{name: "文件", id: 5},{name: "限选项", id: 6},{name: "其他", id: 7}];for (let i = 0; i < typeMap.length; i++) {if (typeMap[i].id === typeId) {return typeMap[i].name;}}return "未定义类型";};return () =>h(TreeTable, { value:treeData , tableStyle: 'min - width: 50rem' }, [h(Column, { field: 'object_Name', header: '分类名称', expander: true }),h(Column, { field: 'is_object', header: '分类类型' }),h(Column, { field:  (item) => displayNameBasedOnId(item.type), header: '参数类型' }),h(Column, { field: 'required', header: '是否必须' }),h(Column, { field: 'desc', header: '描述' })]);}});
export default MyTreeTableConstructr;
import MyTreeTableConstructr  from '@/service/prd/test/mytreetable.js';
const MyTreeTable = new MyTreeTableConstructr();
  1. 为什么可以直接new

    • 构造函数的本质

      • 在JavaScript中,函数可以被用作构造函数。虽然MyTreeTableConstructr函数看起来比较简单,但只要它是一个函数,就可以使用new关键字来创建一个新的对象实例。这里的MyTreeTableConstructr函数被视为构造函数,它返回一个MyTreeTable对象(假设MyTreeTable在函数内部或者其他地方已经被正确定义)。
    • 模块导入与函数可用性

      • 通过export default MyTreeTableConstructr将函数导出,再使用import MyTreeTableConstructr from '@/service/prd/test/mytreetable.js';将函数导入到另一个模块。导入后的函数在当前模块的作用域内是可用的,并且可以按照JavaScript的规则使用,包括使用new关键字来创建实例。
  2. new操作时内存和指针的变化

    • 内存方面

      • 创建新对象

        • 当执行new MyTreeTableConstructr()时,JavaScript首先会在内存中开辟一块新的空间来存储即将创建的新对象。这个新对象最初是一个空对象,它有自己独立的内存地址。
      • 存储对象属性

        • 如果在MyTreeTableConstructr函数内部有对this对象(也就是新创建的对象)的属性赋值操作(虽然在当前代码中未显示,但一般构造函数会有这样的操作),那么这些属性会被存储在新对象的内存空间中。例如,如果函数内部有this.property = 'value';这样的操作,property的值value就会被存储在新对象的内存空间里。
    • 指针方面

      • 设置原型指针

        • 新创建的对象有一个特殊的内部属性__proto__(在现代JavaScript中,更推荐使用Object.getPrototypeOf()来获取原型,但__proto__仍然可以用于理解概念)。当使用new操作符时,这个新对象的__proto__指针会被设置为指向MyTreeTableConstructr函数的prototype属性。这意味着新对象可以继承MyTreeTableConstructr.prototype上的属性和方法。例如,如果MyTreeTableConstructr.prototype.someMethod = function(){};,那么新创建的MyTreeTable对象就可以调用someMethod方法,因为通过__proto__指针建立了这种继承关系。
      • 函数返回对象与新创建对象的关系

        • 由于MyTreeTableConstructr函数返回MyTreeTable,如果MyTreeTable是一个对象(这里假设它是),那么最终const MyTreeTable = new MyTreeTableConstructr();中的MyTreeTable会指向这个返回的对象。如果MyTreeTable不是一个对象(例如是一个基本类型的值),那么根据new操作符的规则,如果构造函数没有显式返回一个对象,new操作符会返回新创建的对象(也就是this对象,在这个例子中是最初开辟内存空间创建的那个新对象)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/497601.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

yolov4算法及其改进

yolov4算法及其改进 1、yolov4介绍2、mosaic与mish激活函数2.1、mosaic数据增强2.2、Mish激活函数 3、backbone网络框架的改进4、PAN-FPN的介绍5、样本匹配和损失函数5.1、样本匹配5.2、YOLOV4损失函数5.2.1、GIOU loss5.2.2、DIOU loss5.2.3、CIOU Loss 1、yolov4介绍 改进点&…

Edge如何获得纯净的启动界面

启动Edge会出现快速链接&#xff0c;推广链接&#xff0c;网站导航&#xff0c;显示小组件&#xff0c;显示信息提要&#xff0c;背景 ●复杂页面 ●精简页面 点击页面设置按钮 关闭快速链接 关闭网站导航 关闭小组件 关闭信息提要 关闭背景 关闭天气提示 精简页面看起来十分舒…

目标检测文献阅读-YOLO:统一的实时目标检测(12.23-12.29)

目录 摘要 Abstract 1 引言 2 统一的检测 3 网络设计 4 训练 5 YOLOv5训练猫狗识别模型 5.1 项目代码整体结构介绍 5.2 数据集和预训练权重的准备 5.3 训练猫狗识别模型 5.3.1 修改数据配置文件 5.3.2 修改模型配置文件 5.3.3 训练模型 5.3.4 启用tensorbord查看…

要查询 `user` 表中 `we_chat_subscribe` 和 `we_chat_union_id` 列不为空的用户数量

文章目录 1、we_chat_subscribe2、we_chat_union_id 1、we_chat_subscribe 要查询 user 表中 we_chat_subscribe 列不为空的用户数量&#xff0c;你可以使用以下 SQL 查询语句&#xff1a; SELECT COUNT(*) FROM user WHERE we_chat_subscribe IS NOT NULL;解释&#xff1a; …

【模块系列】STM321.69TFT屏幕

前言 在翻翻自己的器件盒的时候&#xff0c;发现这块好久之前买的TFT屏了&#xff0c;想起还没有用STM32点亮过&#xff0c;手头上正好有立创的梁山派STM32F4&#xff0c;就试着按照网上的文章教程顺便移植个LVGL看看&#xff0c;然后就有了就本文。 代码工程命名的是LvglDemo&…

Unity中列表List使用出类似字典Dictionary的感觉

首先为什么会有这个标题&#xff1f; 因为字典很好用&#xff0c;只需要键就能拿到值&#xff0c;这种感觉是真的爽&#xff0c;新手最喜欢用了&#xff0c;遇事不决就字典&#xff0c;但是也有不好的地方&#xff0c;字典的内存开销比列表List要大&#xff0c;遍历也是List占…

Android中使用AIDL实现进程通信

前言 关于使用AIDL实现两个APP&#xff08;跨进程&#xff09;通信&#xff0c;我们通常把两个APP分别叫做服务端和客户端。本文不讲原理&#xff0c;只给最简易的案例。 一、服务端APP实现 1. 在src/main/aidl目录下新建一个.aidl文件&#xff0c;然后在.aidl文件中定义需要…

Mac安装多个版本node、java、python 等开发软件环境,安装、卸载、升级多个数据库

安装多个版本node、java、python 等开发软件环境 使用nvm&#xff08;Node.js Version Manager&#xff09;来管理多个Node.js版本。 使用jenv来管理多个Java版本。 使用pyenv来管理多个Python版本。 以下是安装和使用这些版本管理器的基本步骤&#xff1a; 1. 安装多个版本…

Ftrace: 深入探究Linux内核的追踪利器

文章目录 一、 前言二、Ftrace介绍2.1 Ftrace框架2.2 Ftrace的使用场景 三、Ftrace配置和控制接口四、Ftrace使用步骤1&#xff1a;配置内核2. 挂载debugfs3. 查看和配置Ftrace4. 开始追踪[可选]5. 查看追踪结果6. 保存追踪数据7. 清除追踪配置 五、实战演示5.1 function跟踪器…

人工智能基础软件-Jupyter Notebook

简介&#xff1a; Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算&#xff1a;开发、文档编写、运行代码和展示结果。 Jupyter Notebook是以网页的形式打开&#xff0c;可以在网页页面中直接编写代码和运行代码&#xff0c;代码的运行结果也会直…

tesla openday数据驱动串讲

一、我写的目的 tesla的数据驱动全流程代表着现在&#xff08;曾经&#xff09;的sota&#xff0c;总结和沉淀他的方法总结后与自己现在的理念做一次对标&#xff0c;查漏补缺找到自己现在的主要问题&#xff0c;聚焦下一阶段的投入 二、主要方法 本文不讲解tesla的视觉技术…

基于神经网络的车牌识别算法matlab仿真 人工智能方法 车牌识别

一 设计方法 设定matlab的车牌识别系统&#xff0c;用神经网络进行预测&#xff0c;将数据集划分为训练集和测试集&#xff0c;设计神经网络结构。根据输入特征的维度和输出标签的维度&#xff0c;确定网络层数和节点数。使用训练集对神经网络进行训练。通过迭代优化网络权重和…

计算机体系结构期末复习4:多处理器缓存一致性(cache一致性)

目录 一、cache一致性问题 1.一致性定义 2.问题定义 3.解决问题的基本策略 二、写返回(write-back)cache的一致性处理 1.MSI协议 2.MESI协议 3.MOESI协议 三、补充知识点&#xff1a;提升cache性能的因素 1.cache miss的三种情况&#xff1a; 2.影响cache性能的因素…

信息化时代的步伐

信息化时代的步伐 下载压缩包的&#xff0c;解压压缩包得到 这里给了一串数字 我们不知道要用什么解码就用随波逐流解码 一键解码得到 说明这是用中文电报解码&#xff1a; flag{计算机要从娃娃抓起}

Linux 基本指令

目录 1.常见指令 1.1 ls指令 1.2 pwd指令 1.3 cd指令 1.4 touch指令 1.5 mkdir指令 1.6 rm和rmdir指令 1.7 man指令 1.8 cp指令 1.9 mv指令 ​编辑 1.10 cat指令 1.11 more指令 1.12 less指令 1.13 head指令 1.14.tail指令 1.15 时间相关的指令 1.16 cal…

TCP客户端模拟链接websocket服务端发送消息(二)

兄弟们&#xff0c;我来填坑了&#xff0c;o(╥﹏╥)o o(╥﹏╥)o o(╥﹏╥)o o(╥﹏╥)o o(╥﹏╥)o o(╥﹏╥)o&#xff0c;前几天写了个tcp模拟websocket客户端的以为完成&#xff0c;后面需要发送消息给服务端&#xff0c;以为简单不就是一个发送消息么&#xff0c;这不是一…

LVGL——基础对象篇

LVGL——基础对象篇 基础对象篇部件大小位置设置部件位置&#xff08;position&#xff09;设置相关API函数&#xff1a; 对齐对齐方式 样式给部件添加样式添加普通样式添加本地样式样式触发时机设置单独设置部件中某个部分的样式 事件事件&#xff08;events&#xff09;相关A…

【机器学习】机器学习的基本分类-半监督学习(Semi-supervised Learning)

半监督学习是一种介于监督学习和无监督学习之间的机器学习方法。它利用少量的标注数据&#xff08;有监督数据&#xff09;和大量的未标注数据&#xff08;无监督数据&#xff09;来进行模型训练&#xff0c;从而在标注数据不足的情况下&#xff0c;提升模型的性能。 半监督学习…