js中new 一个对象发生了什么?

JavaScript012

js中new 一个对象发生了什么?,第1张

最近在面试的时候,都会被问到在js中,new 一个实例的过程,

比如 :

定义了一个函数Person,里面有三个属性:name,age,sex当var lisi = new Person() 的时候发生了以下4件事:

1.  var obj= {} ,创建了一个空对象 obj{}, 也就是开辟了一块内存地址,新建了一个对象实例(我是这样认为的,如果有不对的欢迎指出);

2. obj.__proto__ = Person.prototype 将 lisi 这个空对象的 __proto__ 指向 Person 的 prototype ,也就是设置原型链;

3. var result = Person.call(obj) ,改变this的指向,让this指向 obj 对象

4。判断Person的返回值类型,如果是引用类型,则返回这个引用类型的对象,如果是普通值类型,就返回obj;

现在来看看打印出的内容:

可以看出lisi这个实例对象的构造函数是Person。

现在写一个函数,这个函数的返回值是一个对象,来观察一下这个对象,和函数体内this指向

①,对象a就是一个空对象

②,对象a没有color属性

③,对象a原型指向Object.prototype

④,函数体内this指向window(上图可见,没调用函数之前,window.color属性不存在)

在执行函数时,加一个new试试看有啥效果:

①,没有return,这个函数居然返回了一个对象

②,对象a有个color属性

③,对象a的原型指向了这个构造函数的prototype属性

④,window对象没有color属性

⑤,this指向了对象a

由上得出总结new的作用:

①,new能让一个构造函数返回一个对象(下面称为A)而无需return

②,new会让函数体内的this指向这个A

③,new会让A的原型指向这个构造函数的prototype属性

PS:

①,new只用了三个字符,却实现了很多功能,非常贴心,可以称呼new为语法糖或贴心语法( syntactic sugar )

②,一个函数自带prototype对象,而且里面默认有一个constructor属性,这个属性返回实例对象的构造函数,如果你重新给prototype对象赋值,小心不要覆盖掉它

③,如果使用new,函数内就别 return一个对象 了 ,这样返回的是return后面的对象,this不会指向它

④,就算函数体内空空如也,new的作用不变

function Fun(argument1,argument2){

return this

}

//直接调用

var f1 = Fun()// window {}

//实例化对象

var f2 = new Fun()// Fun {}

f1 只是调用 Fun函数,而 f2是实例化对象 Fun。两个的this指向的不是同个地方。调用函数的this指向的是window,实例化对象的this指向的是对象本身。

(构造函数的命名通常使用驼峰命名法,首字母大写,以此和普通的函数区分开来,这是一种习惯用法。)

测试例子:

如上,f只是调用fun1,输出的第一个this是指向window的。fun2也只是调用,所以this也是指向windowde。a是实例化的对象,this指向的是fun3实例化后的对象。

如果做下面调整。

如上,fun1跟fun3是被实例化,this指向对象本身,fun2只是调用,this指向window。

那给this的属性赋值会有什么样的结果呢?

调用函数里面的this属性赋值都是给window赋值的。

如果 fun1()改成 var a = new fun1()呢?

大家仔细看看输出的结果。