new的过程发生了什么,封装一个new的方法

一、写一个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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值