美文网首页
深入之new的模拟实现

深入之new的模拟实现

作者: 明里人 | 来源:发表于2019-07-12 15:19 被阅读0次

定义一个构造函数

function Person(a,b,c){
  this.a = a;
  this.b = b;
  Person.prototype.c = c;
}

实现方法一:通过new1(obj,arguments)使用new

function new1(func){
    //new 出的实例对象 __ proto__ 指向构造函数的原型,Object.create创建的对象的__proto__默认指向create方法里的参数
    //用于获取构造函数原型上的成员
    let newObj = Object.create(func.prototype);
    //将arguments转为数组,并截取传递的参数,将构造函数指向新对象
    //考虑到func构造函数可能会有return返回值,使用returnObj接收
    let returnObj = func.apply(newObj,Array.prototype.slice.call(arguments,1));
    // 如果构造函数有return值,并且返回值类型是 object 或者 function,则返回构造函数return的结果
    if((typeof returnObj === 'object' || typeof returnObj === 'function') && returnObj !== null){
        return returnObj;
    }
    return newObj; // 否则返回新创建的实例对象。(一般构造函数中不会进行return,主要是生成新的实例对象)
} 
let obj = new1(Person,1,2,3);
console.log(obj.a);  // 1
console.log(obj.c);  // 3
console.log(obj.__proto__ === Person.prototype); // true

实现方法二:通过 new2 (Person)(1,2,3) 使用new

function new2(func){
    return function(){
        let newObj = {};
        if(func.prototype !== null){
            //将__proto__指向构造函数原型,用于获取原型上的成员
            newObj.__proto__ = func.prototype;
        }
        let returnObj = func.apply(newObj,arguments);
        if((typeof returnObj === 'object' || typeof returnObj === 'function') && returnObj !== null){
            return returnObj;
        }
        return newObj;
    }
}
let obj = new2(Person)(1,2,3);
console.log(obj.a);  // 1
console.log(obj.c);  // 3
console.log(obj.__proto__ === Person.prototype); // true

相关文章

  • new的模拟实现

    原文出处 JavaScript深入之new的模拟实现 new 我们在模拟 new 之前,先看看 new 实现了哪些...

  • 深入之new的模拟实现

    定义一个构造函数 实现方法一:通过new1(obj,arguments)使用new 实现方法二:通过 new2 (...

  • JavaScript深入之new的模拟实现

    已离开简书,原因参见 http://www.jianshu.com/p/0f12350a6b66。 虽人微言轻,但...

  • JavaScript深入之new的模拟实现

    new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象类型之一 也许有点难懂,我们在模拟 new ...

  • JavaScript深入之new的模拟实现

    JavaScript深入系列第十二篇,通过new的模拟实现,带大家揭开使用new获得构造函数实例的真相 new 一...

  • bind的模拟实现

    原文出处 JavaScript深入之bind的模拟实现 bind 我们在模拟 bind之前,先看看 bind实现了...

  • Underscore源码阅读:bind

    bind函数 参考:JavaScript深入之bind的模拟实现 bind(function, object, *...

  • JavaScript之模拟实现new

    使用 new 来调用函数,或者说发生构造函数调用时,会自动执行下面的操作。 创建(或者说构造)一个全新的对象。 这...

  • call和apply的模拟实现

    原文出处 JavaScript深入之call和apply的模拟实现 call 我们在模拟 call之前,先看看 c...

  • 模拟实现new

    mdn关于new运算符的介绍: new 运算符创建一个自定义对象或具有构造函数的内置对象的实例。 是不是看着有点懵...

网友评论

      本文标题:深入之new的模拟实现

      本文链接:https://www.haomeiwen.com/subject/nvwekctx.html