重学JS之重写new方法

33 阅读1分钟

一句话介绍 new:

new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象类型之一

话不多说,直接代码

因为 new 的结果是一个新对象,所以在模拟实现的时候,我们也要建立一个新对象,假设这个对象叫 obj,因为 obj 会具有 Person 构造函数里的属性,想想经典继承的例子,我们可以使用 Person.apply(obj, arguments)来给 obj 添加新的属性。

        function myNew() {
            let obj = new Object(); // 创建一个空对象
            Construnfn = [].shift.call(arguments); // 获取第一个参数,也就是构造函数
            obj.__proto__ = Construnfn.prototype; // 给对象添加原型
            let res = Construnfn.apply(obj, arguments); // 改变this指向
            return typeof res === 'object' ? res : obj; // 返回
        }

        function Person(name, age) {
            this.name = name;
            this.age = age;
        }
        Person.prototype.say = function() {
            console.log(this.name);
        }
        let p = myNew(Person, 'zhangsan', 18);
        p.say();

        console.log(Construnfn);