手写new 2020-06-02

2020-06-02  本文已影响0人  Allan要做活神仙

前言

一直没弄清楚,今天好好花点时间搞搞清楚 new

手写new

function new(Fn) { // Fn 是构造函数
    lat obj = {}; // 1
    obj.__proto__ = Fn.prototype; // 2
    let res = Fn.call(obj);  // 3

    return typeof res === 'Object' ? res : obj; // 4
}

1、创建空对象
2、构造函数this指向新的对象
3、执行构造函数
4、返回新对象 ( 构造函数 return 一个引用类型:返回引用return的内容;否则返回所有内容)

使用:

function new(Fn) { // Fn 是构造函数
    lat obj = {};
    obj.__proto__ = Fn.prototype;
    let res = Fn.call(obj);
    return typeof res === 'Object' ? res : obj;
}

var Person = function(){
  this.name = 'aaa';
  this.fn = function() {
    console.log(this.name);
  }
}

var a = new(Person);

字面量 好还是 new 好?

{}是字面量,可以立即求值,而new Object() 本质上是方法(只不过这个方法是内置的)调用, 既然是方法调用,就涉及到在 proto 链中遍历该方法,当找到该方法后,又会生产方法调用必须的 堆栈 信息,方法调用结束后,还要释放该堆栈

上一篇 下一篇

猜你喜欢

热点阅读