View:new关键词干了什么事,还有原型链是什么

View:new关键词干了什么事,还有原型链是什么

1.new关键词干了什么事:

这里来看一段代码

先创建一个函数,如下:

function myFunction(data) {}

我们现在来用new一个,如下:

const weakMap = new myFunction();

new完了,来打印看看都有什么:

console.log("1. 开始 new 操作");

const weakMap = new myFunction();

console.log("4.", weakMap, "返回this指向的实例");

function myFunction(data) {

console.log("2.",

this.proto === myFunction.prototype);

console.log("3.", this);

}

输出结果是:

那也就是说:

new 操作符做了什么事:

  1. 创建一个空对象

2.挂载连接双方原型,对象的原型是__proto__,构造函数的原型是prototype

3.执行构造函数,将this指向新创建的对象实例

4.如果构造函数返回的是一个对象,则返回这个对象,否则返回this指向的实例

第四点怎么理解呢?你看当上面的代码,我现在没有return,他就是myFunction,现在修改代码,修改为:

function myFunction(data) {

console.log("2.",this.proto === myFunction.prototype);

console.log("3.", this);

return {

age: 18,

}

}

添加了一个return,并且是个对象时,此时的打印结果:

变了,变成返回的对象了,那返回其他类型呢,例如返回一个字符串:

function myFunction(data) {

console.log("2.",this.proto === myFunction.prototype);

console.log("3.", this);

return '创建对象实例成功'

}

结果是返回的myFunction:

也就是对应上第四条:当构造函数有返回时,并且是个对象时,那返回的就是这个对象,否则就是这个this指向的实例。

2.原型链是什么?

我们知道对象上有个原型叫__proto__,函数上面有个原型叫prototype。根据上面我们知道了new操作符创建了一个空对象并且赋值给了weakMap,那也就是说weakMap.__proto__指向了myFunction.prototype。这个暂且参考上面的第二条。

补充:我们知道在 JavaScript 中,每个函数其实都是一个Function对象。函数默认返回undefined。函数的本质又是对象。

让我们来打印:

// 从weakMap开始分析

console.log(weakMap.proto === myFunction.prototype, "true");

console.log(typeof myFunction.prototype);

console.log(myFunction.prototype.proto === Object.prototype, "true");

console.log(typeof Object.prototype,);

console.log(Object.prototype.proto === null, "true");

console.log("===================================")

//从myFunction开始分析

console.log(myFunction.proto === Function.prototype, "true");

console.log(typeof Function.prototype);

console.log(Function.prototype.proto === Object.prototype, "true");

console.log(typeof Object.prototype);

console.log(Object.prototype.proto === null, "true");

结果是:

总结:

// 实例对象的原型链

weakMap(实例对象)

proto

myFunction.prototype (构造函数的原型对象)

proto

Object.prototype

proto

null

// 构造函数本身的原型链

myFunction(构造函数)

proto

Function.prototype

proto

Object.prototype

proto

null

这就是原型链。

补充:当构造函数返回的是一个对象时,他两的原型并不相等,因为此时weakMap 是函数返回的对象,并不是最初构造的函数。

相关推荐
lingggggaaaa2 小时前
小迪安全v2023学习笔记(九十七天)—— 云原生篇&Kubernetes&K8s安全&API&Kubelet未授权访问&容器执行
java·笔记·学习·安全·网络安全·云原生·kubernetes
元亓亓亓2 小时前
SSM--day2--Spring(二)--核心容器&注解开发&Spring整合
java·后端·spring
省四收割者3 小时前
Go语言入门(22)-goroutine
开发语言·vscode·后端·golang
飞川撸码3 小时前
读扩散、写扩散(推拉模式)详解 及 混合模式(实际场景分析及相关问题)
分布式·后端·架构
paopaokaka_luck3 小时前
基于SpringBoot+Vue的志行交通法规在线模拟考试(AI问答、WebSocket即时通讯、Echarts图形化分析、随机测评)
vue.js·人工智能·spring boot·后端·websocket·echarts
程序定小飞3 小时前
基于springboot的蜗牛兼职网的设计与实现
java·数据库·vue.js·spring boot·后端·spring
唐叔在学习3 小时前
Pywebview:Web技术构建桌面应用的最佳选择
后端·python·webview
IT_陈寒4 小时前
5种JavaScript性能优化技巧:从V8引擎原理到实战提速200%
前端·人工智能·后端
做运维的阿瑞4 小时前
GPU即服务:Linux与云原生如何联手开启AI算力“自来水“时代
linux·人工智能·云原生