JS -- 构造函数执行的基本操作

113 阅读2分钟

new方式可以构造类和实例

  • 类:函数数据类型
  • 实例: 对象数据类型 new的时候不论是否加小括号,都相当于把构造函数执行了,也创建了对应的实例对象,只不过不加小括号是不能传参的
funciton CreatePerson(name, age){
    this.name = name
    this.age = age
}
let person1 = CreatePerson('张三', 18)
let person2 = new CreatePerson('李四', 20)

person1:是将CreatePerson以普通函数执行(会生成私有栈内存),先进行形参赋值:name='张三', age = 18

此时函数中的this是window:

this.name = name => window.name = '张三'

this.age = age => window.age = 18

无返回值,所以person1 = undefined

person2:将CreatePerson以构造函数执行(CreatePerson是一个自定义类),它首先也会先普通函数一样去执行(生成私有栈内存),进行形参赋值:name='李四', age = 20

此时在代码执行之前,浏览器会默认创建一个对象数据类型的值,假设地址值为AF0,然后会让this指向AF0(AF0其实是类的实例)

this.name = name => AF0.name = '李四'

this.age = age => AF0.age = 20

最后,函数会默认返回AF0,所以person2 = AF0。在构造函数中,如果手动return的是一个基本值,对返回的实例无影响,如果手动return的是一个引用类型的值,会把默认返回的实例给替换掉(所有在构造函数模式执行下,我们一般都不要手动写return,防止把返回的实例给替换)

new执行也会把类当作普通函数执行,当然也有类执行的一面

  1. 创建一个私有栈内存
  2. 形参赋值 & 变量提升
  3. 浏览器创建一个对象出来(这个对象就是当前类的一个新实例),并且让函数中的this指向这个实例对象 => 构造函数中,方法中的this是当前类的实例
  4. 代码执行
  5. 在我们不设置return的情况下,浏览器会把创建的实例对象默认返回