持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
上一篇写到涉及原型相关的一些基本概念以及原型和原型链的理论,这一篇对原型及原型链进行具体的分析
原型和原型链的类别
1. 函数.prototype
-
前提结论:函数都是对象,每个函数都自带有一个属性叫做 prototype
-
例子:
-
结论: 每个函数下都有一个prototype属性,prototype的属性值是一个对象,这个对象默认的只有一个叫做constructor的属性,指向这个函数本身
-
关系图:
2. 对象.__proto__
-
前提结论: 每个对象都有一个隐藏的属性叫做
__proto__ -
例子:
-
解释:
[[Prototype]]: 是对象的一个内部属性,chrome的引擎通过__proto__向外暴露了这个属性。实际上它可以看作就是对象的__proto__属性
__proto__的值: 等于构造该对象的函数的prototype属性。testObj.__proto__=== testFun.prototype -
结论: 每个对象都有一个__proto__属性,指向该对象的函数的prototype
-
关系图:
3. 函数.__proto__
- 前提结论: 在JavaScript中,函数都是对象,是对象就有隐藏的__proto__属性
- 解释: Function 是最顶级的构造器,函数对象都是通过他构造的
- 结论: 函数.
__proto__=== Function.prototype - 关系图:
4. 函数.prototype.__proto__
- 解释:函数.prototype,他本质上是和 var obj = {} 是一样的,由 new Object创建
- 结论:函数.
prototype.__proto__=== Object.prototype - 关系图:
5. Object.__proto__
- 解释: Object是由顶层构造函数Function构造的
- 结论: Object.proto === Function.prototype
- 关系图:
6. Object.prototype.__proto__
- 结论: Object.prototype较为特殊,它是顶级对象的原型,所以它的_proto__指向是null
- 关系图:
7. Function.__proto__
- 解释:函数对象都是由顶级构造函数Function创建。所以Function是被自身创建的
- 结论:
Function.__proto__=== Function.prototype - 关系图:
8. Function.prototype.__proto__
- 解释:函数.prototype,它本质上是和 var obj = {} 是一样的,由new Object创建
- 结论:Function.prototype.proto === Object.prototype
- 关系图:
关于原型链的举例
- 例子: 使用 toString()方法将数字转为字符串格式输出,同时打印Array原型对象 没有找到toString()方法
const arr = new Array(1,2,3)
console.log(arr.toString())
console.log(Array.prototype)
- 解释:对象通过原型链进行查找,自身没有会通过原型链进行一层一层的查找,直到找到为止,所有的对象都属于Object,这里打印 Object的原型对象,发现有toString方法