"你真正理解`new`操作符了吗?这篇文章告诉你它的秘密!"

今天我们来聊一聊JavaScript中的new操作符,它用于创建一个给定构造函数的实例对象。话不多说,我们来看下面的这一段代码:

js 复制代码
function Person() {
    this.name = 'John';
    this.age = 18;
}

const p = new Person();
console.log(p,p.constructor); // Person { name: 'John', age: 18 } [Function: Person]

我们发现,构造函数Person上面的属性,实例对象p也能够访问,并且,构造函数原型对象(prototype)上的 constructor属性,它也能够访问。

这能够说明什么呢?

  • 构造函数的this指向了实例对象
  • 实例对象的__proto__指向了构造函数的prototype

再来看这一段代码:

js 复制代码
function Person() {
    this.name = 'John';
    this.age = 25;
    return {
        hobby: 'coding'
    }
}

const p = new Person();
console.log(p,p.constructor); // { hobby: 'coding' } [Function: Object]

我们会发现,这里的实例对象p好像又不能访问构造函数Person上面的属性了,而只能访问构造函数返回的那个对象。那么如果返回值不是对象,又会出现什么结果呢?

js 复制代码
function Person() {
    this.name = 'John';
    this.age = 25;
    return 123
}

const p = new Person();
console.log(p,p.constructor); // Person { name: 'John', age: 25 } [Function: Person]

我们会发现,如果不是返回一个对象的话,那和没有返回值是一样的。其实是这样的,new操作符在创建实例对象的时候干了这么一件事。

  • 创建一个空对象
  • 将该对象的__proto__指向构造函数的prototype
  • 执行构造函数,并将构造函数的this指向该空对象
  • 如果构造函数具有返回值,并且返回值是一个对象,那么返回该对象,否则返回我们刚开始创建的空对象。

如下便是一个简单的new的实现

js 复制代码
function myNew(fn, ...args) {
        // 创建一个新对象
        const obj = {}
        // 构造函数的prototype 指向 实例对象的__proto__
        obj.__proto__ = fn.prototype
        // 将构造函数的this指向obj,并执行构造函数
        const result = fn.call(obj, ...args)
        // 如果返回值是对象,返回对象,否则返回新对象
        return typeof result === 'object' && typeof result !== null ? result : obj
    }

今天的分享就到这,如有不对的地方,欢迎大家指正。

相关推荐
Alair‎5 分钟前
前端开发之环境配置
前端·react.js
谢尔登7 分钟前
Vue3底层原理——keep-alive
javascript·vue.js·ecmascript
Deca~10 分钟前
VueVirtualLazyTree-支持懒加载的虚拟树
前端·javascript·vue.js
CTO Plus技术服务中12 分钟前
强悍的Go语言开发面试题和答案
java·面试·职场和发展
2501_9445264213 分钟前
Flutter for OpenHarmony 万能游戏库App实战 - 主题切换实现
android·开发语言·javascript·python·flutter·游戏·django
爱上妖精的尾巴18 分钟前
7-11 WPS JS宏 对象的属性值为函数的写法与用法
前端·javascript·wps·js宏·jsa
zuozewei19 分钟前
零基础 | 使用LangChain框架实现ReAct Agent
前端·react.js·langchain
坠入暮云间x19 分钟前
React Native for OpenHarmony开发环境搭建指南(一)
前端·react native·开源
爱上妖精的尾巴22 分钟前
7-12 WPS JS宏 this、return用构造函数自定义类-1:对象内部函数,外部调用的写法
前端·javascript·wps·js宏·jsa
har01d28 分钟前
AI生成的 vue3 日历组件,显示农历与节日,日期可选择,年月可切换
前端·vue.js·节日