new操作符都做了什么

var fun = function () {
    this.name = 'peter';
    
    return {
        name: 'jack'
    };
}

var fun1 = function() {
    this.name = 'peter';
    
    return 'jack';
}

var p1 = new fun();
var p2 = new fun1();
p1.name; // jack
p2.name; // peter

为何p1和p2的name值不一样,要从new操作符提及,在new的时刻,顺序做了以下四个建立步骤:

  1. 建立一个空对象
  2. 将所建立的对象的__ proto __指向组织函数的prototype
  3. 执行组织函数中的代码,组织函数中的this指向该对象
  4. 返回该对象(除非组织函数中返回了一个对象或许函数)

注重第4步,上述 fun和fun1组织函数中因为fun返回的是一个对象,一切p1即是fun中返回的对象,

fun1中返回的不是对象,一切p2.__ proto __即是fun1.prototype;

用代码模仿new建立历程就是

function objectFactory() {
    //把argumnets转化为数组
    var args = Array.prototype.slice.call(arguments);
    // 提取第一个组织对象
    var Constructor = args.shift();
    // 建立constructor实例 instance 
    var instance = Object.create(Constructor.prototype);
    // 运用apply函数运转args,把instance绑定到this
    var temp = Constructor.apply(instance, args);
    //返回对象推断,是object 照样 null 照样实例
    return (typeof temp === 'object' ||typeof temp === 'function'  && temp !== null ) ? temp : instance;
}
    原文作者:哈哈哈我只是想笑
    原文地址: https://segmentfault.com/a/1190000017757940
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞