当前位置:网站首页>论构造函数的原型是谁
论构造函数的原型是谁
2022-07-27 00:14:00 【Wuuconix】
论构造函数的原型是谁
我们知道,作为构造函数,比如Object,它们都有一个属性prototype,在new一个新的对象的时候,会把这个对象的原型设置为这个prototype属性指向的对象。
下面的语句可以证明这一点。
let o = new Object
console.log(Object.getPrototypeOf(o) === Object.prototype)

我之前也一直以为,构造函数Object的原型也是prototype,因为这个属性也太富有迷惑性了,光看名字很容易让人这样想。
直到今天,我发现Object.__proto__和Object.prototype不一样。
console.log(Object.__proto__)
console.log(Object.prototype)

我便陷入了疑惑,在我之前的认知里,__proto__作为一个不太规范的属性,是用来获得某个对象的原型的,而prototype从字面意义很明显也是获得原型的。
那按理说这两个属性应该是返回相同的值,现在却不一样了?
现在我们用规范设定的标准方法Object.getPrototypeOf()来获取Object的原型,看看到底__proto__还是prototype返回的结果正确。
console.log(Object.__proto__)
console.log(Object.prototype)
console.log(Object.getPrototypeOf(Object))
console.log(Object.getPrototypeOf(Object) === Object.__proto__)

可以看到,__proto__属性返回的结果才是Object构造函数的真实原型。
所以实际上,构造函数的prototype属性只是用作new一个新对象的时候把它赋值给新对象的原型用,至于构造函数本身的原型,和它八竿子打不着。

从这张总结图中,我们可以看到,所有构造函数的原型都指向了一个匿名函数。
Object的原型也是,在node中输出出来有些问题,浏览器的终端里看的很清楚。


构造函数的原型是一个函数,听起来很奇怪对吧?原型原型,原型是原型对象的简称啊,原型不应该是一个对象嘛?
这实际上就告示这JavaScript讲函数式语言和面向对象的语言结合的结果。在JS中函数是对象态的,函数也是一个对象。
所以node中输出出来,是一个{},其实也没什么问题,应该函数也是对象,里面为什么是空的,只是因为这个函数对象里面的属性都是不可枚举的。

可以看到这个函数对象里面,有着我们常用的 call,apply,bind,这些方法都定义在所有函数的原型里面——一个匿名函数。
值得注意的是,我们之前提出了一个论断 大部分构造函数的prototype属性和__proto__属性完全不一样。
因为__proto__属性指向构造函数自己的原型,而prototype属性指向实例的原型。
而有一个构造函数,它的原型和它构造出来的实例的原型是同一个,它就是Function。

这是构造函数Function构造出来的也是函数所必要的。
它本身也是函数,它构造出来的也是函数,它们作为函数,都需要函数所公用的一些东西,所以它们需要拥有共同的原型,即那个匿名函数。
还有一点从那个总结图中可以看出来,所有构造函数的原型,即那个匿名函数,指向了那个原型链的尽头,即Object.prototype,即所有普通对象【Object构造函数产生的对象】的原型。
这也完美诠释了JS中函数也是对象的含义。
边栏推荐
- MySQL 5.7 takes the first item of the group
- Arduinouno drive RGB module full color effect example
- Blog competition dare to try BAC for beginners
- OD-Paper【3】:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
- Lua函数之非全局函数
- 次轮Okaleido Tiger即将登录Binance NFT,引发社区热议
- CuteOne:一款OneDrive多网盘挂载程序/带会员/同步等功能
- C language program compilation (preprocessing)
- Goatgui invites you to attend a machine learning seminar
- 次轮Okaleido Tiger即将登录Binance NFT,引发社区热议
猜你喜欢
![[redis] five common data types](/img/0f/17945b6f3a7735d9a569296c2c0e2a.png)
[redis] five common data types

Web3.0 world knowledge system sharing - what is Web3.0

Dynamically set the height of applet swiper

Jmeter接口测试, 快速完成一个单接口请求

从ACL 2022 Onsite经历看NLP热点

C language program compilation (preprocessing)

Redis installation and operation (Linux)

Okaleido tiger logged into binance NFT on July 27, and has achieved good results in the first round

次轮Okaleido Tiger即将登录Binance NFT,引发社区热议

CS224W fall 1.2 Applications of Graph ML
随机推荐
Debezium series: pull historical data based on debezium offset to ensure that data is not lost
进程的调度
Kubernetes Dashboard 部署应用以及访问
Which securities firm is safer to open an account and buy REITs funds?
Cs224w fall course - --- 1.1 why graphs?
对象创建的流程分析
JMeter interface test, quickly complete a single interface request
Plato Farm全新玩法,套利ePLATO稳获超高收益
Arduinouno drive RGB module full color effect example
Okaleido tiger is about to log in to binance NFT in the second round, which has aroused heated discussion in the community
MySQL 5.7 takes the first item of the group
贪心——376. 摆动序列
OD-Paper【3】:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
Okaleido Tiger 7.27日登录Binance NFT,首轮已获不俗成绩
CS224W fall 1.2 Applications of Graph ML
Manually build ABP framework from 0 -abp official complete solution and manually build simplified solution practice
次轮Okaleido Tiger即将登录Binance NFT,引发社区热议
As for the pit saved by serialized variables, the data added with indexer cannot be serialized
Lua函数之非全局函数
LeetCode->二分法(三)