javaScript-原型和原型链
2021-02-06·2min
type
Post
summary
status
Published
category
tags
slug
date
Feb 6, 2021
password
icon
在面向对象语言中,可以通过类来抽象多个实例的公共属性和方法,基于类可以创建多个对象,以达到封装,继承,多态的目的。
在JS中没有类的概念,为了能够实现面向对象语言的特性(封装,继承,多态),需要有一个地方来存放公共的属性和方法,这个地方就是原型对象。
prototype
在JavaScript中,每个函数都有一个prototype属性,这个属性指向一个对象。这个对象就是该函数作为构造函数时,创建的实例的原型对象。
proto
如同函数都有一个prototype属性指向它创建的实例的原型一样。实例对象有一个__proto__属性指向原型对象。
constructor
在原型中也有一个属性指回它的构造函数,这个属性就是constructor 。
注意:原型中没有指向实例对象的属性,因为可能有多个实例对象共享一个原型。
以上的关系可以用一张图来做概括:

原型链
因为在JavaScript中,一起皆是对象,且每个对象都会关联一个原型,并从原型中继承属性和方法。
因为原型也是一个对象,所以它也遵循以上这个原则,它也有相关联的原型,简单来说就是原型也有自己的原型。
这样多个原型对象连接起来的链条,我们称之为原型链。
可以通过一张图来解释这种关系:

图中这条由__proto__链接起来的蓝色线就是原型链,连接起多个原型,对象通过原型链来查找属性和方法。
此外,要注意的是,原型链的尽头是Object.prototype,当然Object.prototype也有__proto__,但值为null,也就是此路不通。
对象属性和方法的查找过程
当要访问一个对象中的某个属性或时,如果对象本身中没有,就会去它的原型中找。
如果原型中也没有,就会去原型的原型中找,一直找到最顶层的原型(Object.prototype),如果还找不到,就会返回undefined。