new实现

一文大白话讲清楚javascript中new的原理和实现 阅读详情
AI摘要

本文深入解析C++中的new操作符实现机制,包括new operator、operator new及placement new的用法,以及如何重载new操作符。通过实例演示new在内存管理中的角色,对比malloc,阐述其在对象构造和析构中的作用。

new实现

前言

本篇来分析new是怎么实现的, 使用c++进行在申请对象的时候用到new, 但是为什么申请对象要用到new, 而不能用malloc, 而有时申请数组的用new或者malloc似乎又都可以, 这里就来分析一下new实现.

new operator, operator new以及placement new

  1. new operator用法

其实new operator我们经常在使用, 就是我们直接向堆申请一块内存大小, 然后对该内存进行构造和析构.

template<class T> class point
{
	T x; T y;
};
point<int> *p = new point<int>[3];

这就是new operator的用法. 其实在使用它的时候, 它会做两步事情.

  1. 向堆申请一块大小的内存.
  2. 对其有构造函数的执行构造函数

其实剩下的两种用法就是将 new operator 的两个功能分开做.

  1. operator new用法

operator new申请一块空间, 但是申请完了就什么都不做. 这感觉就很像malloc函数啊. 对, 没错. 其实operator new就是间接性的调用了 malloc函数. 我们直接来看源码部分

void* __CRTDECL operator new(size_t const size)
{
    for (;;)
    {
        if (void* const block = malloc(size))
        {
            return block;
        }

        if (_callnewh(size) == 0)
        {
            if (size == SIZE_MAX)
            {
                __scrt_throw_std_bad_array_new_length();
            }
            else
            {
                __scrt_throw_std_bad_alloc();
            }
        }
    }
}

很清楚的可以看出来5行的确是直接的调用了malloc函数, 然后除了申请的大小判断就没有了, 那为什么我们不直接用malloc函数而要用operator new??? 主要是new的封装, 可重载吧, 毕竟我们常说new不是函数, 而是操作符也是有原因的. 接下来就是最后一个了.

  1. placement new用法

placement new是在已经申请的内存上构建对象. 这就是我们调用new的时候会调用对象的构造函数的原因. 有一点, 刚说了可以在已经申请的内存上构建对象, 难不成不只是堆, 连栈上也能构建对象.

这也是我们内存池经常用的方法, 使用placement new在已经申请的内存上构建对象

它的用法就很灵活了.

int buff[10];
int *p = new(buff) int(0);

这样我们就在已分配空间的buff中重新构建对象了, 传入的buff代表的是地址, 后面括号代表的初始化的值. 这个例子也证实了我们可以在栈中分配对象, 因为buff就在栈中. 而buff[0]与p都指向的同一块地址.

这里就要注意, 我们用buff地址开始申请的对象, 就尽量不要用buff了, 因为buff的数据被重新的修改了, 使用buff可能就会出现奇怪的数据.

在这里插入图片描述
在这里插入图片描述

同时, buff的长度要足够装下对象的大小, 否则就会出现数据覆盖的危险. 这个博主详细的实现了这个问题** .


现在我们来验证一下上面说的吧. 这个一个很简单的程序, 通过gdb调试定位在new的执行, 可以看到

template<class T>
class point
{
	public: 
		point()
		{
		}
	private:
		T x;
};

int main()
{
	point<int> *p = new point<int>[3];

	return 0;
}

在这里插入图片描述

图片中的第二行, 对应的跳转就是我们最后一行的要跳转的操作符(operator new), 执行了之后在图片中的下一个call就是调用类的构造函数. new操作符的实现是两步就可概括为先申请了空间, 再调用构造函数.

new的重载实现

前面提了几次关于new可以重载, 那怎么实现重载呢? 我们不是说过new是一个运算符吗, 就是重载运算符就行了.

template<class T>class point
{
public:
    point(T i) : i(i)
    {
        cout << "point constructor" << endl;
    }
	void *operator new(size_t size, void *p, const string& str) 
    {
        cout << "operator new" << endl;
        if (!p)
        {
            cout << "new" << endl;
            return ::operator new(size);
        }
        return p;
    }
private:
    T i;
};
char buf[sizeof(point<int>)];
point<int> *pc = new (buf, "first new") point<int>(1);

以上就是简单的new的重载. 运行时会有一个奇怪的现象, new先执行, 原因就是先要为类分配内存啊, 所以new比构造函数先执行.


总结

解释了new, 同样的, delete的实现也是跟new有很多相似的, delete事先调用析构函数, 然后再调用free函数释放内存, 同样是可以将析构和释放内存分开调用, 也可以进行重载, 这里就不细讲了. 至于为什么new的对象一定要用delete来释放也容易想明白, 因为delete会默认调用其析构函数, 而free仅仅只是释放空间而没有调用析构. 如果是普通变量用new或malloc申请内存都是可以用delete释放, 毕竟没有析构的就默认什么也不做然后释放内存.


参考 : Placement new operator in C++

JS中new的原理及实现 在调用new的过程中做了四件事: 1.新生成对象 2.链接到原型 3.绑定this 4.返回新对象 接下来就针对这几点,实现类似new的方法 //定义create方法 function create(){ //定义空对象 let obj = {}; //取出参数列表的第一个参数(构造函数) let Con = [].shift.call(arguments); //手动指正obj的构造函数为Con(链接原型) obj.__proto__ = Con.prototype; //调用Con,改变this为obj,传入剩余参数arguments let resul 立即下载

相关推荐

PCB线路板的制作工艺流程分享!2021-08-21

Pcb板制作工艺流程:开料-钻孔-沉铜-压膜-曝光-显影-电铜-电锡-退膜-蚀刻-退锡-光学检测-印阻焊油-阻焊曝光、显影-字符-表面处理-成型-电测-终检-抽测-包装。具体如下:1、开料(CUT) 将原始的覆铜板切割成可以用在生产线上制作的板子过程2、钻孔 使PCB板层间产生通孔,以达到连通层间的目的。 3、沉铜 经过钻孔后的线路板在沉铜缸内会发生氧化还原反应,形成铜层对孔进行孔金属化,使原来绝缘的基材表面沉积上铜,达到层间电性相通。 4、压膜 压膜后的PCB板上面压了一层蓝色的干膜, 干膜是一个载体

jdbpcb88的博客 3245

new的实现原理

目录 1.new的四个步骤 2.new的实现过程 3.例子 1.new的四个步骤 创建一个空对象→这个新对象继承原函数的原型→更改this指向,为对象设置属性→返回新对象 1.创建一个空对象 varobj={} 2.这个新对象继承原构造函数的原型 obj._proto_=Constructor.prototype 3.更改this指向,为对象设置属性 letresult=Constructor.apply(...

weixin_44164982的博客 2672

Python | 处理CMIP6 NC数据,以tas为例

各位同学,一般在文章最后一章我们可能会做不同气候情景下变量的未来时空变化特征,类似上图。从cmip6下载的nc数据常需要转换格式、裁剪到研究区和重采样等,本期代码可以解决这类问题。

qq_48539301的博客 1384

new操作符的实现原理及几种手写方法

new操作符的实现原理及几种手写方法

stay hungry, stay foolish 1917

c语言面试5(希诺麦田)

在 C 语言中,当使用strlen函数计算字符串的长度时,它会返回字符串中字符的实际个数,不包括字符串结束符’\0’。而sizeof(array)返回的是array指针所占用的字节数,通常在 32 位系统上为 4 个字节,在 64 位系统上为 8 个字节。在给定的代码中,array被初始化为"\0\0",其中包含两个转义字符’\0’。当使用strlen函数计算array的长度时,它会遇到第一个’\0’并停止计数,因此返回的长度为 2。12.下面四个选项是四个整数在内存中的存储情况,其中数值最大的一个是。

Pierce110110的博客 1052

基于IMX429-IMX430-IMX432-IMX437系列传感器的SLVS-MIPI桥接方案设计与实现

本文详细介绍了针对索尼IMX429、IMX430、IMX432及IMX437系列传感器的SLVS-MIPI桥接方案设计与实现。针对工业视觉、车载摄像头等应用中主流SoC仅支持MIPI接口的痛点,提出基于FPGA(如Lattice Crosslink-NX)的透传桥接方案,将传感器输出的SLVS信号无损转换为MIPI CSI-2信号,确保数据完整性与低延迟,并探讨了硬件选型、逻辑设计及多传感器兼容性等关键问题。

weixin_29230901的博客 460

new的实现

new

m111115的博客 933

vue项目表格甘特图开发

🧩 甘特图可以管理项目进度,生产进度等信息,管理者可以更直观的查看内容。

qq_35946021的博客 991

javascript中的new原理及实现

本文介绍new的功能,用法,补充介绍了不加new也同样创建对象的方式,分析了new的原理,最后模拟了new的实现。学习本文内容需要你了解js中对象,原型链,call,bind,arguments的用法。

接着奏乐接着舞的博客 3545

C++程序无法正常启动(报0xc000007b错误)问题的详细排查

本文详细介绍了应用程序启动时遇到0xC000007B错误的排查过程。问题源于32位程序与64位运行时库的不匹配,以及缺少依赖的运行时库。通过分析系统日志、使用Windbg和检查程序位数,最终确定问题在于32位程序误引用了64位系统目录下的库文件。

dvlinker的技术专栏 1万+

Ceph入门到精通-存储桶通知

这 通知还可以根据前缀的匹配项过滤掉事件,并且 (1) 键的后缀,(2) 附加到对象的元数据属性, 或 (3) 对象标签。在此模式下,操作仅在以下之后确认(确认) 通知将发送到主题的已配置终端节点。这意味着 通知的往返时间(发送 通知主题的终端节点以及接收 确认)被添加到操作本身的延迟中。要更新主题,请使用用于创建主题的相同命令(但在 更新时,使用现有主题的名称和不同的终端节点值)。端口:对于未加密的连接,默认为 5672,对于未加密的连接,默认为 5671 SSL 加密连接。(默认情况下,这是“假的”。

隔壁老瓦的专栏 1131

手动实现new

手动实现一个new 首先来看一个案列 function Dog (name,age){ this.name = name; this.age = age; this.say = function () { console.log("I am " + this.name) } } var dog = new Dog('旺财',4) console.log(dog) // Dog {name: "旺财", age: 4, say:f } 这一过程实际是:在ne

YMX2020的博客 1246

HBase骚操作之数据加载方式BulkLoad

本文研究了一种HBase BulkLoad的入库方式,该方式利用HBase的数据信息按照特定格式存储在hdfs内这一原理,直接在HDFS中生成持久化的HFile数据格式文件,然后上传至合适位置,即完成巨量数据快速入库的办法。该方式配合MapReduce完成,高效便捷,而且不占用Region资源,增添负载,在大数据量写入时能极大的提高写入效率,并降低对Hbase节点的写入压力。HBase BulkLoad对于异构数据源的合并及大量数据一次性导入具有重要指导意义,相比HBase Put操作在性能上具有较高的优势

石榴姐yyds 7789

js中 new原理及实现

在js中,我们通过new运算符来创建一个对象,它是一个高频的操作。我们一般只是去用它,而很少关注它是如何实现的,它的工作机制是什么。 1 简介 本文介绍new的功能,用法,补充介绍不加new也同样也创建对象的方式,分析了new的原理,最后模拟了new的实现。 学习本文内容需要你了解js中对象,原型链,call,bind,arguments的用法。 2 内容 •基本用法•不写new也能创建对象•new原理•模拟new的实现 3 new 的基本用法 我们通过new来创建对象,它的基本格式是: .

sqLeiQ的博客 4054

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

如何实现一个 new

面试官问:能否模拟实现`JS`的`new`操作符 me or you:木问题!!! 一、进行分析new的过程,主要有以下几点 1、创建一个新的对象 2、把obj的__proto__指向fn的prototype,实现继承 3、改变this的指向,执行构造函数、传递参数,fn.apply(obj,) 或者 fn.call() 4、返回新的对象obj 二、实现代码 &lt;script...

果果的博客 5599

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

自己实现一个new方法

前沿 好久没有写点东西了,最近看了下js基础教程,觉得有些东西还是有必要记录下来 关于new new关键字通常和构造函数一起使用,用于创建对象。 function Animal(name, action) { this.name= name; this.action= action; this.run= function () { ...

hp123456003的博客 2626

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

new 实现原理

要自己实现一个new功能,实现要知道new操作符都干了些什么,其实总的来说就四步: 1.创建一个空对象 2.链接到原型 3.绑定this值 4.返回新对象 知道了这些步骤,我们就可以自己模拟实现new方法了 function _new () { var obj = new Object(); var [func, ...args] = [...arguments]; obj....

yangkuanli0802 1742

使用js实现一个new方法

js实现一个new 在开发过程中,我们经常会使用new关键字,那我们在使用new关键字的时候,new到底做了什么呢?我们可以查阅资料,在MDN中有这样一段话 new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。new 关键字会进行如下的操作: 1. 创建一个空的javascript对象就比如(即{}); 2. 链接该对象(即设置该对象的构造函数)到另一个对象; 3. 将步骤1新创建的对象作为this的上下文; 4. 如果该函数有没有返回对象,没有则返回this; 知道

CallMeBY的博客 4107

如何实现一个new方法

如何实现一个方法起到与new相同的作用 首先我们先看看new方法做了什么,又具有什么特性: new的过程中发生了下面这些事: 1、创建一个对象; 2、将构造函数作用域赋到创建的对象中(因此this将会指向这个新对象); 3、执行构造函数中代码; 4、返回这个对象 new关键字与构造函数组合使用生成一个实例,例如: const person = new Person() new组合构造函数生成了新的实例,这个新的实例与构造函数具有以下关系,其实也就是原型中的关系: person.__proto__ ==

qq_42764407的博客 1875

new 的模拟实现

1、MDN 对 new 运算符的描述: new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。new 关键字会进行如下操作: 创建一个空的简单的 JavaScript 对象(即 {}); 链接该对象(即设置对象构造函数)到另一个对象; 将步骤1新创建的对象作为 this 的上下文; 如果该函数没有返回对象,则返回 this ; 看个例子: function Person...

weixin_39066827的博客 446

js new一个对象的过程,实现一个简单的new方法

对于大部分前端开发者而言,new一个构造函数或类得到对应实例,是非常普遍的操作了。下面的例子中分别通过构造函数与class类实现了一个简单的创建实例的过程。 // ES5构造函数 let Parent = function (name, age) { this.name = name; this.age = age; }; Parent.prototype.s...

weixin_30449239的博客 1401

JS中new的实现

我们知道,JS中的new操作符可以用来创建构造函数的实例对象,比如下????: function Cat(name, age) { this.name = name this.age = age } var cat1 = new Cat('小米', 2) // Cat { name: "小米", age: 2 } 我们打印一下cat1: 那么new内部到底做了什么呢❓听我们娓娓道来 ...

zlear小窝 484

JavaScript new 关键词解析及原生实现 new

java里面,new 运算符是用来实例化一个类,从而在内存中分配一个实例对象。但在 javascript 中,原型语言没类,只有对象与原型链继承 JavaScript 中 new 表达式的作用是生成一个对象。 new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。 new 关键字会进行如下的操作: 创建一个空对象(即{}); 链接该对象(即设置该对象的构造函数)到另一个对象 ; 将步骤1新创建的对象作为this的上下文 ; 如果该函数没有返.

周陆军的博客,分享it技术。 407

java中new的原理_JS中new的实现原理及重写

提到new,肯定会和类和实例联系起来,如:functionFunc() {let x= 100;this.num = x +}let f= new Func();上面的代码,我们首先创建了一个函数,如果是用面向对象的说法就是创建了一个Function类的实例,如果直接执行这个函数,那它就是一个普通的函数,如果用new执行,则这个函数被称为一个自定义的类。如果是一个普通函数执行,他会如下做几件事:·...

weixin_39927288的博客 260

JavaScript深入之new的模拟实现

JavaScript深入之new的模拟实现

Seasons_in_your_sun的博客 269

JavaScript中new的实现

文章来源于我的个人博客:JS中new的实现 JS中通过new操作符可以创建构造函数的实例对象,我们可以看看以下例子: function Person(name,age){ this.name = name this.age = age console.log(this) /* Person{name: "tanj", age: "18"} */ } Person.p...

monkeyHI 390
上一篇: c++11 constexpr浅析
下一篇: STL源码分析之空间配置器
Function_18
博客等级 码龄10年 193粉丝 239原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值