javaScript 进行new操作的时候执行了操作

需要了解:

原型链、this

开始:MDN对new的介绍

[MDN new] (https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/new)
new创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例

new 关键字会进行如下的操作:

步骤1: 创建一个空的简单 JavaScript 对象(即 {});

let obj = {}

步骤2: 为步骤 1 新创建的对象添加属性 proto,将该属性链接至构造函数的原型对象;

obj.__proto__ = constructor.Prototype

步骤3: 将步骤 1 新创建的对象作为 this 的上下文;

let res = constructor.apply(obj, args)

步骤4: 如果该函数没有返回对象,则返回 this。

由构造函数返回的对象就是 new 表达式的结果。如果构造函数没有显式返回一个对象
(一般情况下, 构造函数不会有返回值,但是我们可以自己返回对象, 覆盖创建的动作)

        function _new(constructor, ...args) {
            // let obj = {}
            // obj.__proto__ = constructor.Prototype
            // 一个继承自 constructor.prototype 的新对象
            let obj = Object.create(constructor.prototype)
            let res = constructor.apply(obj, args)
            // 如果构造函数没有返回对象, 则返回我们创建的对象
            if(res instanceof Object) {
                return res
            } else  {
                return obj
            }
        }

现在我们调用一下_new

        function Person(name) { 
            this.name = name
        }
        const per1= new Person("小王")
        const per2 = _new(Person, '小王')
        console.log(per1, per2)
new.png

注意! 模拟实现的函数_new传入的参数只能是构造函数,不能是类

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容