你会知道有关原型与原型链题的那些事~

你还会想知道的有关的原型

在之前总结中,有总结到一些关于原型与原型链的知识点。本来还想加一下各类笔试中,有关原型与原型链的题目,后面忙着忙着给忘了,现在补上,同时也加深一下自己的理解。

首先还是得把这个图先放置出来,重新好好理解,方便给后面的解释能好好摸鱼

特别需要提醒一点:

Object 实例化对象__proto__ 是指向 Object.prototype

而 Object 本身 __proto__ 是指向 Function.prototype

即是任何一个能new对象的构造器,都是Function实例化的结果(正如 函数是一类公民的说法一样

简单说就是构造器 __proto__ 是指向 Function.prototype

基础

function f1(tname) {if(tname) {this.tname = tname
  }
}
f1.prototype.tname = 'change'
Object.prototype.tname = 'Object change'
Function.prototype.tname = 'function change'
const ff = new f1()
console.log(ff.tname) // change 

解释:(直接上图理解

所以在实例后的f,找属性,在本身找不到的情况下,会向原型对象去查找

最终输出 change

同理如果题目改成:

function f1(tname) {
++this.tname = tname
}
f1.prototype.tname = 'change'
Object.prototype.tname = 'Object change'
Function.prototype.tname = 'function change'
const ff = new f1('no change')
console.log(ff.tname) 

那最终会输出 no change

进阶

Array.a =1
Array.prototype.a = 2
Function.prototype.a = 3
Object.prototype.a = 4
var arr = []
console.log(arr.a);
console.log(arr.length.a);
console.log(arr.forEach.a);
console.log(Function.a);
console.log(Object.a); 

输出结果为:

2
4 
3
3
3 

不知道这次伙伴们能不能做对呢,可能在最后一个输出上有点疑惑,现在就好好学习加以解释一下

解释:

第一个输出: console.log(arr.a) // 2

首先要明确一点 arr = []arr = new Array() 的申明方式是一样的

因此 会存在 arr.__proto__ = Array.prototype

所以 arr 在本身中找不到原型 就向原型对象查找 最后是找到 2 的数据

第二个输出console.log(arr.length.a) // 4

首先先进行一层层解析

arr.length 输出的是 arr 数组的长度 再去输出 该长度下 a 的值

有一点很特殊: 长度?(Number数据类型 原始数据类型会有 a 的属性?)

所以,在这里需要转一个弯

原始数据会有自己的 __proto__ 指向他的构造器的原型对象的

const num = 1
const str = 'str'
const bool = true
const tbigint = 10n
​
console.log(num.__proto__) // 输出Number原型对象
console.log(str.__proto__) // 输出String原型对象
console.log(bool.__proto__) // 输出Boolean原型对象
console.log(tbigint.__proto__) // 输出Bigint原型对象
​
console.log(num.__proto__.__proto__ === Object.prototype) //true
console.log(str.__proto__.__proto__ === Object.prototype) //true
console.log(bool.__proto__.__proto__ === Object.prototype) //true
console.log(tbigint.__proto__.__proto__ === Object.prototype) //true 

所以最终都会指向 Object.prototype, 输出 4

第三题输出console.log(arr.forEach.a) // 3

大概解释和上面差不多的,同样需要一层层解构

先对 arr.forEach 的 a 属性进行输出

arr.forEach 是一个方法,所以先在本身方法查找有无该属性, 没有就从原型对象查找 Funtion.prototype

最终输出 3

第四题输出console.log(Function.a) // 3

还是之前的知识点

Function.__proto__ = Function.prototype

因此输出 3

第五道输出console.log(Object.a) // 3

首先函数是第一类公民,一切的Object可以说都是函数的实例化的结果

所以再结合上面的图,很快就能得出结果了

所以最后输出 3

最后

最近还整理一份JavaScript与ES的笔记,一共25个重要的知识点,对每个知识点都进行了讲解和分析。能帮你快速掌握JavaScript与ES的相关知识,提升工作效率。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值