详细说明javascript new的运行机制
像其他高级语言一样,javascript也有新的操作符。我们知道新的操作符用于实例化一个类,从而在内存中分配一个实例对象。但是在javascript中,一切都是对象,那么为什么要用new来创建对象呢?本文将带您探索javascript中的新奥秘。
首先,了解新的操作员。
函数Animal(name){ this . name=name;} Animal.color=' blackanimal . prototype . say=function(){ console . log(' I ' is this . name);};var cat=新动物(“猫”);console.log(cat.name,//cat . height//undefined);cat . say();//我是猫控制台. log(Animal.name,//Animal . color//back);animal . say();//Animal.say不是函数。如果你能理解上面的输出,就意味着你已经非常了解new和这个在js中的运行机制。请忽略这篇文章!
我们将通过分析这个例子来加深您对js中新运算符的理解!【如果你对js不了解,请先阅读:JS范围和这个关键词】
1.代码解释。
第1-3行创建了一个函数Animal,并定义了属性:name,名称在此。name的值是执行函数时的参数。
第四行在Animal对象上定义了一个静态属性: color(Animal本身是一个函数对象),并赋值为“black”。
第5-7行在Animal函数的原型对象原型上定义了一个say()方法,say方法输出该方法的名称值。
第8行通过new关键字创建一个新的对象猫。
10-14行cat对象尝试访问名称和颜色属性,并调用say方法。
16-20行动物对象尝试访问名称和颜色属性,并调用say方法。
2.专注于分析。
第八行代码是关键:
var cat=新动物(“猫”);JS引擎在执行这段代码时,做了大量的内部工作,用伪代码模拟其工作流程如下:new Animal(' cat ')={ var obj={ };物体。__原型_ _ _=动物.原型;var结果=Animal.call(obj,‘cat’);返回结果类型==='obj '?结果: obj}(1)创建一个空对象obj
(2)将对象的原型指向动物的原型,建立对象对象的原型链:对象-动物。原型-对象。原型-空。
【如果不了解JS原型链,请先阅读JS原型和原型链】
(3)在obj对象的执行环境中调用Animal函数,传递参数“cat”。相当于var结果=obj。动物(“猫”)。
当这个句子被执行时,obj生成属性名并将其指定为“cat”。【请阅读JS中调用的用法:JS中的调用和应用】
(4)检查步骤3返回的返回值,如果没有返回值或者返回非对象值,则将obj作为新对象返回;否则,返回值将作为新对象返回。
在了解new的运行机制后,我们知道cat实际上是流程(4)的返回值,因此我们对cat对象的了解更多:
猫的原型链是猫类动物。原型-对象。原型-空。
猫身上有了新的属性:名字。
分析完cat的生成过程,我们再来看看输出:
cat . name-在过程(3)中,obj对象生成name属性。因此,猫名是这里的obj.name。
cat . color-猫会先寻找自己的颜色,如果没有找到,就会沿着原型链寻找。在上面的例子中,我们只在Animal对象上定义了颜色,而没有在它的原型链上定义,所以我们找不到它。
Cat.say-cat首先会找到自己的say方法,如果没有找到,就会沿着原型链找到。在上面的例子中,我们在《动物》的原型上定义了say,所以我们在原型链上找到了say方法。
此外,this.name也在say方法中访问,这里指的是它的调用者obj,所以输出是obj.name的值
对于Animal来说,它也是一个对象,所以在访问属性和方法时也遵守上面的搜索规则,所以:
动物。颜色——“黑色”
动物名称——“动物”,动物首先搜索自己的名字,然后找到它。注意:但是这个名字不是我们定义的名字,而是函数对象的一个内置属性。
一般来说,当生成一个函数对象时,名字属性是内置的,函数名被当作赋值(只有函数对象)。
动物说-动物本身不会找到说的方法,但会沿着原型链查找。动物的原型链是什么?
根据测试结果,动物的原型链如下:
动物-功能.原型-对象.原型-空
因此,在Animal的原型链中没有定义say方法!
二、新存在的意义。
知道了新的运算符之后,我们再回到开头提到的问题:JS中的一切都是对象,那么为什么要用new来创建对象呢?要理解这个问题,首先要理解猫和动物的关系。
通过上面的分析,我们发现猫继承了Animal的一些属性,所以我们可以简单的理解为Animal和cat是遗传的。
另一方面,猫是new生成的对象,那么猫是Animal的实例对象吗?我们先来了解JS是如何定义“实例对象”的。
B的一个实例如果上面的表达式为真,JS认为a是B的一个实例对象,我们用这个方法来判断猫和动物。
动物的猫实例;//执行结果为真:猫确实是一个Animal实例。为了证实这个结果,我们来看看JS中instanceof的判断规则:
var L=A. _ _ proto _ _var R=B .原型;如果(L===R)返回真;如果a的__proto__相当于b的原型,则为True。
在new的执行过程(2)中,猫的__proto__指向动物的原型,所以猫和动物符合实例的判断结果。因此,我们认为猫是动物的实例对象。
在javascript中,原始对象的实例对象可以由new生成,这个实例对象继承了原始对象的属性和方法。所以new存在的意义在于它在javascript中实现了继承,而不仅仅是实例化一个对象!
版权声明:详细说明javascript new的运行机制是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。