当前位置: 首页 > Web前端 > vue.js

对象是新的,那么发生了什么?

时间:2023-03-31 16:24:55 vue.js

对象是新的,所以发生了什么?什么,看到这个标题我惊呆了,程序员居然有对象?当然有,什么年代了。不信你看了之后,面试官会问你发生了什么事?专业一点:new是用来实例化一个类,然后在内存中分配一个实例对象。让我们来看一个例子:.name);};varken=newPerson("LifeCode");console.log(ken.name,//"LifeCode",ken.hairColor,//undefinedken.height//undefined);ken.说();//"我的名字是生命密码"console.log(Person.name,//"Person"Person.hairColor//"black");Person.say();//Person.say不是函数这段代码发生了什么?接下来揭晓答案,重点分析第8行代码是关键:varken=newPerson("lifecode");person本来就是一个普通的函数,但是如果你给他加上新的操作,就变成了一个结构体函数。然后JS引擎在解析代码的时候会在内部做很多处理,伪代码如下:newPerson('lifecode')={varobj={};//定义对象varproto=Object.create(Person.prototype);//复制原型obj.__proto__=proto;//构建原型链//obj->Person.prototype->Object.protorype->nullvarres=Person.call(obj,'lifecode');//相当Forobj.Person('lifecode')//如果没有返回值或者返回非对象值,obj将作为一个新对象返回:returntypeofres==='object'?结果||obj:obj;}us可以得出以下几点:obj.name是在Person.call(obj,'lifecode')之后赋值的可以得出如下原型链产生:ken.name:临时变量obj有name,obj返回后赋值给ken,ken的一些属性来自于它。ken.hairColor:ken实例对象首先搜索自己的hairColor,如果没有找到,则沿着原型链搜索。在上面的例子中,我们只是在Person对象上定义了hairColor,而没有在它的原型链上定义,所以找不到。到达。ken.height:ken实例对象首先寻找自己的高度,如果没有找到,就会沿着原型链寻找,没有原型链,所以找不到。ken.say:ken会先查找自己的say方法,如果没有找到,就会沿着原型链查找。在上面的例子中,我们在Person.prototype上定义了say,所以我们在原型链上找到了say方法。另外,在say方法中也访问了this.name,这里this指的是它的调用者。如果ken调用say,ken是调用者,所以输出ken.name的值。总结new运算符创建用户定义对象类型的实例或具有构造函数的内置对象的实例。new关键字将执行以下操作:创建一个空的简单JavaScript对象(即{});将对象(即设置对象的构造函数)链接到另一个对象;使用步骤1中新创建的对象作为this的上下文;如果函数不返回对象,则返回this。代码实现请参考以下链接:https://github.com/sisterAn/JavaScript-Algorithms/issues/71