手写代码之new

new都做了啥

new出来的实例对象能够:

  • 访问构造函数里的属性
  • 访问构造函数的原型对象上的属性

图解实现思路

image.png

实现代码

function mynew(){
    let obj = new Object(), //从Object.prototype上克隆一个对象,作为初始化,为了方便后面赋值给函数的实例
        Constructor = [].shift.call(arguments); //取得第一个参数,即外部传入的构造器,此外因为 shift 会修改原数组,所以 arguments 会被去除第一个参数
        
    let F = function() {};  //为了使obj能通过F与Constructor.protptype产生关联(要想两个对象之间产生__proro__这样的关联,就需要新建一个函数,作为构造函数,通过构造函数的原型指向对象二,对象一是构造函数的实例)
    F.prorotype = Constructor.prototype;
    obj = new F();
    //这样obj,就能访问构造函数Constructor .prototype上的属性了
    Constructor.apply(obj, arguments);  //借用外部传入的构造器给obj设置属性
    
    return obj
}

语言描述

new出来的对象能够做到两件事:1、访问构造函数里的属性,2、访问构造函数的原型对象上的属性。所以如果手写new的话就要实现:传入构造函数和参数,返回一个对象(如果构造函数没有默认返回的话),并且使原型对象在这个返回的对象的原型链上。

首先声明一个对象obj,从Object.prototype上克隆一个对象,然后从传入的arguments里获取第一个参数,即构造函数。

然后再声明一个匿名函数,使匿名函数的原型指到构造函数的原型上。

再创建一个匿名函数的实例,赋给obj。

这样obj,就能访问构造函数Constructor .prototype上的属性了。

最后利用apply将传入的构造函数的this的指向obj,并且给obj设置属性。

阅读 306

推荐阅读