0%

对象是怎么new出来的

以前对通过new一个构造函数生成实例对象不是很理解,今天终于弄明白了,嘿嘿。

首先要明白实例对象生成的过程中它经过了哪些步骤。

1、它既然是一个对象,所以要先创建一个空对象。

1
const obj={}

2.实例对象可以使用构造函数原型上的属性和方法,所以要将实例对象的__proto__指向构造函数的原型

1
obj.__proto__ =Func.prototype;

3、实例对象可以访问到构造函数的属性,所以要将构造函数的this绑定到实例对象上,让this.name 变成obj.name(举个栗子)

1
let result = Func.apply(obj, args) //args为构造函数的参数

现在这个空对象就可以访问到构造函数的构造函数原型上的所有属性和方法。

1
2
3
4
5
6

result={
__proto__ = Person.prototype,
name='Tom',
age =30
} //感觉这地方表述有点问题???

4、构造函数没有return语句,则需要把新创建的对象给返回回去(这里补充一个知识点,构造函数的返回值如果是原始类型的值,则直接被忽略,如果返回的是对象,则创建的实例对象具有的属性是返回对象的属性,并不具有构造函数没有返回的属性),所以我们要把所有的属性给返回回去;

1
return result instaneOf Object ? result: obj;

最后,附上完整new 函数代码

1
2
3
4
5
6
7
function myNew(Func, ...args){
const obj={};
//为什么这一句要在绑定this的前面呢,因为构造函数原型上的方法可能会用到this,这样可以把this都找出来,后面统一绑定
obj.__proto__ = Func.prototype;
let result = Func.apply(obj,args)
return result instanceof Object ? result: obj;
}