0
点赞
收藏
分享

微信扫一扫

new的过程发生了什么,模拟一下new的

尤克乔乔 2022-03-30 阅读 58

一、写一个new,看下new的过程发生了什么;

1.场景一 (函数没有返回值);

function Person(name) {
    this.name = name,
    this.say = function () {
        console.log('说话')
    }
}

let p1 = new Person("小红");
console.log('p1',p1)       
console.log("p1的name", p1.name) //小红
console.log('P1的隐式原型', p1.__proto__ === Person.prototype) // true

由上可得:

  1. new 的过程创建了一个新的对象;
  2. 把 p1.__proto__链接到 Person.prototype 身上;
  3. 会继承构造函数身上静态的属性,动态的方法;

2.场景二 (构造函数没有返回值);

 function Person2(name) {
     this.name = name;
     return { age: 20 }
 };
 let p2 = new Person2('小红');
 console.log('p2',p2) //{age:20}

由上可得:

  1. 如果构造函数有返回值,则返回构造函数的返回值。 

二、模拟一个new的过程;

    以上两种场可知new的过程:

    function myNew(callBack, ...arg) {
            //1.创建一个简单的javaScript空对象,即{};
            let obj = {};
            //2.修改实例obj的隐式原型指针(直向callBack的显式原型对象)
            obj.__proto__ = callBack.prototype
            //3.改变this指针,指向obj,并给obj赋值。
            const res = callBack.apply(obj, arg);
            //4.如果callBack没有返回对象,则返回res
            return obj
        }
        const p3 = myNew(Person, '小红')
        console.log('P2', p2)
举报

相关推荐

0 条评论