源码时代前端干货分享|new关键字底层原理-执行过程

构造对象关键字:new

众所周知,js是用new来产生对象的,那么今天我们就来说说js里new产生对象的构造原理。

//人类构造函数
function People(){

}
People.prototype.index = 1; //在原型上绑定一个index属性,值为1

var p1 = new People(); //我们都知道使用new可以产生一个对象,但是到底是怎么产生出来的对象,想必很多同学都不清楚

我们都知道,new在js里可以产生一个对象,但是它到底是怎么产生的对象呢?现在我们就来探秘new的底层原理
每当我们使用new产生对象的时候,底层进行了很多操作,简单描述可分为以下2步

  1. 实例化一个空对象(Object),继承构造函数的原型(prototype)
  2. 已当前Object为上下文,执行new后面的函数,并改变this指向
    分步解析
    new People() = {

//1 var obj = new Object();

//2 obj.proto= People.prototype;

//3 People.call(obj);

}
(1)第1行:创建一个空对象obj;
(2)第2行:把obj的proto指向People的原型对象prototype
(3)第3行:在当前对象上下文内执行People函数,并改变this指向,指向此对象本身
那么属性是在什么时候绑定上去的呢?我们可以看到People原型的index属性并没有赋值过给obj,但是为什么obj有index这个属性呢?
function People(){

}
People.prototype.index = 1;

var p1 = new People();
console.log(p1.index); //打印1
其实,当我们把obj的proto指向People的原型对象时,就产生了obj的原型链
obj -> People.prototype -> Object.prototype -> null
当我们在找obj.index属性时,它会先找自身的index属性,如果找不到,则会顺着原型链向上找,这时会找到People.prototype.index,所以最后打印1。
如果在People的原型上也找不到,那么它会继续往上去找,直到最后找到null。
function People(){

}
People.address = "ChengDu";
People.prototype.index = 1;

var p1 = new People();
console.log(p1.index); //1
console.log(p1.address); //undefined
为什么address属性获取不到呢?仔细看,People这个构造函数其实并不在原型链上,address属性绑定的实在People函数本身,而没有在People.prototype上!
如果你能看理解上面的代码,说明你已经对这块已经比较熟了,那么我们再往下看!
1 function People(){
2
3 }
4 People.prototype.index = 1;
5 var p1 = new People();
6 People.prototype.index = 20;
7 console.log(p1.index); //现在p1.index等于多少呢?1还是20?
如果你的答案是20,你已经掌握了刚才的内容。
(1) 第5行,产生p1
(2) 第6行,修改People原型的index属性,index现在变为了20
(3)第7行,访问p1.index,p1因为没有index属性,所以顺着原型链找到People.prototype.index,打印20

我们再来看一个变形示例
1 function People(){
2
3 }
4 People.prototype.index = 1;
5 var p1 = new People();
6 p1.index = 30;
7 console.log(p1.index); //现在p1.index是多少?
8 console.log(People.prototype.index) //1还是30?
答案,p1.index = 30; People.prototype.index = 1;
如果你已经正确!恭喜,你已经熟练掌握本章内容,可以跳过以下部分!

(1) 第5行,产生p1
(2) 第6行,给p1绑定index属性,并赋值30
(3)第7行,访问p1.index,找属性时,会优先找自己身上,如果没有,才会顺着原型链向上找,此时自身已有index属性,所以打印30
(4) 第8行,访问People.prototype.index,因为People原型的index属性并没被修改过,所以打印的值还是1
看到这里,对new的底层执行过程总算弄明白了吧!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32 PLC是一款基于STM32微控制器开发的可编程逻辑控制器。底层码是指该PLC的底层驱动程序及相关功能模块的代码。而FX2N码是指一款常见的PLC芯片型号,可能是与STM32 PLC兼容的芯片。下面我将从两方面分别说明这两部分的码。 对于STM32 PLC的底层码,它包含了该PLC的主要驱动程序,如各种外设的驱动代码、通信协议的实现以及各种功能模块的初始化和配置等。通过分析底层码,我们可以了解该PLC所支持的硬件资和功能,例如串口、SPI、I2C、ADC、PWM等,并可以根据需求进行相关配置和扩展。此外,底层码还可以帮助开发人员理解PLC的工作原理,优化性能,提高稳定性和可靠性。 而针对FX2N码,它是FX2N芯片的驱动程序,FX2N是一种广泛应用于工业自动化领域的PLC芯片,也可能是与STM32 PLC兼容的硬件芯片。FX2N码包含了该芯片的底层驱动程序,例如IO口的配置、定时器、计数器的使用等。通过分析FX2N码,我们可以了解芯片的工作原理和功能特性,为后续的应用程序开发提供基础。同时,借助FX2N码,我们还可以对该芯片进行优化和适配,满足特定应用的需求。 综上所述,STM32 PLC底层码是提供给开发人员的该PLC的底层驱动程序和功能模块的代码,而FX2N码是指FX2N芯片的驱动程序。通过分析这两部分码,我们可以深入了解硬件的工作原理和特性,为PLC的开发和应用提供基础支持和优化。 ### 回答2: stm32 plc底层-fx2n码指的是使用stm32作为主控芯片的PLC(可编程逻辑控制器)系统的底层码,其中fx2n是一种常见的可编程控制器型号。 PLC是一种常用于自动化控制系统的设备,其底层码是指PLC系统的核心代码,包括底层硬件操作相关的代码和与外部设备通信的代码。 stm32是一款常用的ARM Cortex-M系列的微控制器,具有较强的处理能力和丰富的外设接口,非常适合用于开发PLC系统。底层码中的stm32部分负责控制外设、处理中断,以及管理存储器等功能。 而fx2n则是一种常用的可编程逻辑控制器,在PLC系统中扮演着重要的角色。fx2n的底层码负责实现PLC的逻辑控制功能,包括对输入输出模块的读写操作、模拟量的测量和控制、定时器和计数器的管理等。 在stm32 plc底层-fx2n码中,通常会包含底层驱动代码,如GPIO驱动、串口驱动、定时器驱动等,用于控制外设。同时还会包含IO处理代码,用于实现PLC的输入输出功能。此外,还会有一些逻辑控制相关的代码,用于处理程序的执行流程和逻辑判断。 综上所述,stm32 plc底层-fx2n码是一种基于stm32和fx2n的PLC系统的核心代码,负责控制外设、处理输入输出、逻辑控制等功能。这些码的存在使得开发者可以根据需要进行定制和修改,实现各种自动化控制应用。 ### 回答3: STM32 PLC底层-FX2N码是指在STM32平台上实现FX2N PLC相应功能的程序代码。 FX2N是三菱(Mitsubishi Electric)公司的一款经济实惠的中小规模程序控制器,常用于工业自动化控制领域。而STM32是意法半导体(STMicroelectronics)公司推出的一款低功耗、高性能的32位微控制器,广泛应用于各种领域。 STM32 PLC底层-FX2N码的主要目标是通过STM32平台实现FX2N PLC的功能,包括输入输出控制、定时器计数器、数据存储等。底层码通常包括对外设寄存器的读写、中断处理、时钟管理等功能的实现。 在编写STM32 PLC底层-FX2N码时,需要参考FX2N PLC的手册和相关技术文档,了解FX2N PLC的寄存器映射和硬件特性。然后结合STM32微控制器的开发环境和库函数,编写相应的代码来实现FX2N PLC的各项功能。 在FX2N码中,可能会包含与输入输出模块通信的代码、控制定时器计数器的代码、处理中断的代码等。这些代码通常涉及对STM32的外设寄存器的读写,以及相应的算法和逻辑。 值得注意的是,实现STM32 PLC底层-FX2N码需要对FX2N PLC的工作方式和功能有深入的理解,并且需要熟悉STM32平台的开发环境和相关工具。同时,由于FX2N PLC可能有不同的变种,对于每个具体的FX2N PLC型号,还需要针对性地进行码开发和适配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值