原生JS实现new方法

Javascript中的new操作符实际上做了以下4件事情:

  1. 创建一个新的空对象
  2. 链接新创建的对象和构造函数的原型对象(就是将新对象的隐式原型__proto__指向构造函数的原型对象prototype
  3. 执行构造函数,并将构造函数中的this指向新的对象
  4. 第三步如果没有返回对象,就返回this
     function createNew(){
        //创建新的空对象
        let obj = {};
        //解构获得构造函数和参数
        let  [constructor,...params] = [...arguments];
        //链接对象到函数原型
        obj.__proto__  = constructor.prototype;
        //执行构造函数,将构造函数中的this指向obj对象
        let result = constructor.apply(obj,params);
        //如果函数没有返回对象,就返回新创建的对象
        return typeof result === 'object'?result:obj        
    }


    function Person(name){
        this.name=name;
        Person.prototype.sayName=()=>{
            console.log(this.name)
        }
    }
    let a = new Person('king');
    a.sayName()
    console.log(a)//Person {name: "king"}

    let b = createNew(Person,'sara')
    console.log(b)//Person {name: "sara"}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  •   面向对象(Object-Oriented,OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意...
    霜天晓阅读 2,263评论 0 6
  • 一、 JS面向对象编程 1、 面向对象介绍 什么是对象? Everything is object (万物皆对象)...
    宠辱不惊丶岁月静好阅读 918评论 0 2
  • 第一章 错误处理: 错误: 程序运行过程中,导致程序无法正常执行的现象(即bug) 现象: 程序一旦出错,默认会报...
    fastwe阅读 1,254评论 0 1
  • 面向对象的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象。ECMAScr...
    DHFE阅读 1,092评论 0 4
  • 最近很多人感叹,这是不寻常的2019。 甚至说,这是最灰暗的2019。 抑郁,家暴,猝死。 这三个词组在2019年...
    Vichelle_c875阅读 336评论 0 1

友情链接更多精彩内容