JavaScript | 使用new关键字的时候做了什么?

new的原理

现在要创建一个新的对象,比如这个对象是一个人(Person),代码如下:

javascript 复制代码
function Person(name, age, job) {
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function () {
        console.log(this.name);
    };
}
let person1 = new Person("Walter White", 50, "Chemist");

当使用new操作符的时候,进行以下操作:

  1. 在内存中创建一个新的对象
  2. 将这个对象的__proto__指向构造函数的prototype(原型对象)
  3. this指向这个新的对象
  4. 执行构造函数内部的代码,给这个对象添加属性与方法
  5. 返回这个新的对象(所以构造函数里面不需要写reutrn

下面来看下代码上的实现:

javascript 复制代码
function Person(name, age, job) {
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function () {
        console.log(this.name);
    };
}

function myNew(Class, ...args) {
    // 1. 在内存中创建一个新的对象
    const o = new Object();
    // 2. 将这个对象的__proto__指向构造函数的prototype(原型对象)
    o.__proto__ = Class.prototype;
    // 3.让this指向这个对象
    // 4.指向构造函数的代码,给这个对象添加属性与方法
    const result = Class.call(o, ...args);
    // 5.返回这个新对象
    return typeof result === "object" ? result : o;
}

// 使用new创建
let person1 = new Person("Walter White", 50, "Chemist");
// 使用手写函数创建
let person2 = myNew(Person, "Walter White", 50, "Chemist");
console.log(person1); // Person {name: 'Walter White', age: 50, job: 'Chemist', sayName: ƒ}
console.log(person2); // Person {name: 'Walter White', age: 50, job: 'Chemist', sayName: ƒ}

补充

myNew函数优化写法:

javascript 复制代码
function myNew(Class, ...args) {
    // 1. 在内存中创建一个新的对象
    // 2. 将这个对象的__proto__指向构造函数的prototype(原型对象)
    const obj = Object.create(Class.prototype);
    // 3.让this指向这个对象
    // 4.指向构造函数的代码,给这个对象添加属性与方法
    let result = Class.apply(obj, [...args]);
    // 5.返回这个新对象
    return typeof result === "object" ? result : obj;
}

const obj = Object.create(Class.prototype);等价于

javascript 复制代码
// 1. 在内存中创建一个新的对象
const o = new Object();
// 2. 将这个对象的__proto__指向构造函数的prototype(原型对象)
o.__proto__ = Class.prototype;

参考文献

相关推荐
小小小小宇1 小时前
虚拟列表兼容老DOM操作
前端
悦悦子a啊1 小时前
Python之--基本知识
开发语言·前端·python
安全系统学习2 小时前
系统安全之大模型案例分析
前端·安全·web安全·网络安全·xss
涛哥码咖3 小时前
chrome安装AXURE插件后无效
前端·chrome·axure
OEC小胖胖3 小时前
告别 undefined is not a function:TypeScript 前端开发优势与实践指南
前端·javascript·typescript·web
行云&流水3 小时前
Vue3 Lifecycle Hooks
前端·javascript·vue.js
Sally璐璐3 小时前
零基础学HTML和CSS:网页设计入门
前端·css
老虎06273 小时前
JavaWeb(苍穹外卖)--学习笔记04(前端:HTML,CSS,JavaScript)
前端·javascript·css·笔记·学习·html
三水气象台4 小时前
用户中心Vue3网页开发(1.0版)
javascript·css·vue.js·typescript·前端框架·html·anti-design-vue
灿灿121384 小时前
CSS 文字浮雕效果:巧用 text-shadow 实现 3D 立体文字
前端·css