1. function CreatePerson(name,age) {
    2. this.name= name;
    3. this.age= age
    4. }
    5. // CreatePerson('张三',12) => this:window, 普通函数执行
    6. let person1 = new CreatePerson('二哈',19); // 构造函数执行

    new CreatePerson()执行和普通函数执行的联系:
    1.new这种执行方式叫做“构造函数执行模式”,此时的CreatePerson不仅仅是一个函数名,被称为类,而返回的结果(赋值给person1)的是一个对象,我们称之为 实例 ,而函数体中的this都是这个实例
    image.png
    如何在执行构造函数的时候自己手动添加retrurn,对返回的实例无影响,如果手动return的是一个引用类型的值,会把默认返回的实例给替换掉(所以在构造函数模式执行情况下,我们一般不要手动写return,防止把返回的实例给替换)

    习题

    1. function Fn(n) {
    2. let m = 10; // 全局10
    3. this.total = n+m;
    4. this.say = function () {
    5. console.log(this.total);
    6. }
    7. }
    8. let f1 = new Fn(10)
    9. let f2 = new Fn(20)
    10. let f3 = new Fn; // new的时候不论加不加小括号,都相当于把fn执行了,也创建了对应的实例,只是不加小括号是不能传递实参的,(当前形参为undefined)
    11. console.log(f1.m) //undefined
    12. console.log(f2.n) //undeined
    13. console.log(f1.total) //20
    14. f2.say() //30
    15. console.log(f1 === f2) //false 这是2个不同的实例对象,也就是不同的堆地址

    总结:1. 和实例有关系的操作一定是this.xxx = xxx,因为this是当前类创造出来的实例
    2.私有变量和实例没有必然关系

    1. function Fn() {
    2. /*
    3. new执行也会把类当做普通函数执行(当然也有类执行的一面),
    4. 1.创建一个私有栈内存
    5. 2.形参赋值 & 变量提升
    6. 3.浏览器创建一个对象出来(这个对象就是当前类的一个新实例),并且让函数中的this指向这个实例对象,构造函数中,方法this是当前实例
    7. 4.代码执行
    8. 5.在我们不设置return的情况下,浏览器会默认将实例对象返回i
    9. */
    10. }