当前位置:网站首页>原型和原型链
原型和原型链
2022-08-06 15:46:00 【Ocean!!】
什么是原型
::: tip JS原型的概念
javascript常被描述为一种基于原型的语言(每个对象都拥有一个原型对象)当访问一个对象的属性时,它不仅在该对象上寻找,还会寻找该对象的原型,以及该对象原型的原型,层层向上,直到找到或者到达原型链的末尾
函数可以有属性。每个函数都有一个特殊的属性叫作原型
prototype
:::
function doSomething(){
}
console.log( doSomething.prototype );
// 控制台输出
/* { constructor: ƒ doSomething(), __proto__: { constructor: ƒ Object(), hasOwnProperty: ƒ hasOwnProperty(), isPrototypeOf: ƒ isPrototypeOf(), propertyIsEnumerable: ƒ propertyIsEnumerable(), toLocaleString: ƒ toLocaleString(), toString: ƒ toString(), valueOf: ƒ valueOf() } } */
上面这个对象,就是大家常说的原型对象
可以看到,原型对象有一个自有属性constructor,这个属性指向该函数,如下图关系展示:
什么是原型链
::: tip 原型链的概念
- 原型对象也有可能拥有原型,并从中继承方法和属性,一层一层,以此类推。这种关系就形成了原型链(这也就是为何一个对象会拥有定义在其他对象中的属性和方法)
- 在对象实例和它的构造器之间建立一个链接(它是
__proto__属性,是从构造函数的prototype属性派生的),之后通过上溯原型链,在构造器中找到这些属性和方法
例子:
:::
function Person(name) {
this.name = name
this.age = 20
this.sayName = function() {
console.log(this.name)
}
}
// 创建实例
let person = new Person('Ocean')
根据代码,我们可以得到下图:

::: tip
- 构造函数
Person存在原型对象Person.prototype - 构造函数生成实例对象
person,person的__proto__指向构造函数Person原型对象(Person.prototype) Person.prototype.__proto__指向内置对象,因为Person.prototype是个对象,默认是由Object函数作为类创建的,而Object.prototype为内置对象Person.__proto__指向内置匿名函数anonymous,因为 Person 是个函数对象,默认由 Function 作为类创建Function.prototype和Function.__proto__同时指向内置匿名函数anonymous,这样原型链的终点就是null
:::
小结
1. __proto__作为不同对象之间的桥梁,用来指向创建它的构造函数的原型对象的
如图
2. 每个对象的__proto__都是指向它的构造函数的原型对象prototype的
person1.__proto__ === Person.prototype
3.构造函数是一个函数对象,是通过 Function 构造器产生的
Person.__proto__ === Function.prototype
4.原型对象本身是一个普通对象,而普通对象的构造函数都是Object
Person.prototype.__proto__ === Object.prototype
5.刚刚上面说了,所有的构造器都是函数对象,函数对象都是 Function 构造产生的
Object.__proto__ === Function.prototype
6.Object 的原型对象也有__proto__属性指向null,null是原型链的顶端
Object.prototype.__proto__ === null
::: tip
- 一切对象都是继承自
Object对象,Object对象直接继承根源对象null - 一切的函数对象(包括
Object对象),都是继承自Function对象 Object对象直接继承自Function对象Function对象的__proto__会指向自己的原型对象,最终还是继承自Object对象
:::
边栏推荐
猜你喜欢

微信小程序平台能力——讲笑话情话服务

Intel transformation was not successful and into loss, AMD grow again and get substantial profits

LeetCode:724. 寻找数组的中心下标————简单

MASA Stack 第三期社区例会

C语言函数参数中的三个点(三点 “...”)是干什么用的?(可变参数)<stdarg.h>、va_start 宏、va_arg 宏、va_end 宏

学会make/makefile基本用法

13. Implementation of paging loading datasets for SAP ABAP OData service (Paging)

cmd command line tool

挡不住了,中国芯片制造产业链的重大突破,5nm设备即将发给台积电

PC 真的不行了!Intel、AMD 同遭生死劫
随机推荐
预解析案例
什么是数据库
The most detailed zero-copy technology explanation I have seen so far
【C编译】报错问题收集
nvidia-smi报错(重装Nvidia驱动)
nodejs(四)自定义模块加载机制,第三方模块的加载机制,目录作为模块
为什么要做LiveVideoStack课程?
LeetCode 0174. 地下城游戏
HJZS-E002(断电延时)电源监视继电器
7 public accounts with excellent reputation!
RTU远程终端控制系统S274
Kotlin 协程之取消与异常处理探索之旅(上)
Detailed explanation of car audio service
GNN for mmWave radar: Radar-PointGNN
Unity editor extension - top menu bar extension
Apache Calcite入门
【NLP】一文简要了解词义消歧与实体消歧
PysparkNote103---window滑窗
Ant Group builds the industry's first full-picture risk control and explains the technical architecture in detail for the first time
reits基金开户在手机操作安全吗?