手写New

new的过程

要了解new,肯定要知道原生new都在‘后台’执行了哪些操作。

  1. 在内存中创建一个新的空对象
  2. 将这个对象的__proto__指向构造函数的prototype原型对象
  3. 将构造函数的作用域赋给这个对象(就是改变构造函数的this指向这个新的对象)
  4. 执行构造函数内部的代码,并将其属性和方法添加给那个新的对象
  5. 返回这个新的对象

编写

new示范

要写一个new就要先看看new是怎么使用的

function Person(name,age) {
    this.name = name;
    this.age = age;
}
Person.prototype.sayHi = function(){
    console.log('Hello world!');
}

let myPerson = new Person('张三',19);
myPerson.sayHi(); // Hello world
console.log(myPerson); // Person {name: '张三', age: 19}

自制

按照原生new的流程一步一步的书写就可以实现

function myNew(Con,...args) {
    // 1.在内存中创建一个空对象
    let obj = {};
    
    // 2.将新对象的原型指针指向构造函数的原型属性
    obj.__proto__ = Con.prototype;
    
    // 3.构造函数内部的this被赋值为这个新对象(即this指向新对象)
    // 4.执行构造函数内部的代码(给新对象添加属性)
    let res = Con.apply(obj,args);// apply会执行Con函数,当然此时的this已经是obj了
    
    // 5.如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象
    if (res instanceof Object) {
        return res
    }else{
        return obj
    }
}

注意

let res = Con.apply(obj,args);

这一部分是改变传入构造函数的this指向为创建的空对象。而第二个参数是要传递给那个构造函数的。apply方法是会执行一次Con的,所以你传入的args就传递给了那个构造函数,当然你的构造函数里面写的无非就是this.xxx = xxx这种…

如果传入的构造函数有返回值,那么就要返回那个返回的值,前提是返回的是非空对象。都不满足则返回创建的新对象

使用

function Person(name,age) {
    this.name = name;
    this.age = age;
}
Person.prototype.sayHi = function(){
    console.log('Hello world!');
}
let myPerson = myNew(Person,'张三',19)
myPerson.sayHi();  // Hello world
console.log(myPerson);  // Person {name: '张三', age: 19}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值