4.JavaScript原型和原型链
4.1 概念介绍
- 原型和原型对象
原型也是对象,叫原型对象。所以,原型和原型对象是一回事,只不过有人说的简洁,有人说的是全称。 - 原型链
原型(原型对象)、构造函数和(对象)实例构成了原型链。原型链的核心就是依赖对象的__proto__
指向,当检索依赖对象本身不存在的属性时,就会一层一层地向上去查找创建对象的构造函数,一直找到Object
,就没有__proto__
的指向了。 - 构造函数
首字母大写的函数。例如:function Person() { }
- 对象实例对象有两种:
- 函数对象:通过
new Function();
创建的对象; - 普通对象:除了函数对象之外的所有对象;
- 函数对象:通过
4.2 概念之间的关系
- 每一个函数都有一个
prototype
属性; - 每一个JavaScript对象(null除外)都具有一个属性,叫做
__proto__
,这个属性指向该对象的原型(prototype
); - 每一个原型都有一个
constructor
属性指向关联的构造函数,
4.3 示例
使用构造函数创建对象:
function Person() { } var person = new Person(); person.name = "Kevin"; console.log(person.name); // "Kevin"
Person就是一个构造函数,我们使用
new
创建了一个实例对象 person。prototype每个函数都有一个
prototype
属性 每一个JavaScript对象(null
除外)在创建的时候就会与之关联另一个对象,这个对象就是我们说的原型,每一个对象都会从原型“继承”属性。function Person() { } //注意:prototype是函数才会有的属性 // 而__proto__是对象才会有的属性 Person.prototype.name = "Kevin"; var person1 = new Person(); var person2 = new Person(); console.log(person1.name); // "Kevin" console.log(person2.name); // "Kevin"
proto
function Person() { } var person = new Person(); console.log( person.__proto__ === Person.prototype ); // true
constructor
function Person() { } console.log( Person === Person.prototype.constructor ); // true
4.4 总结
理解原型和原型链的前提是,弄清楚这里面一共有多少个概念,以及概念和概念之间的关系。
这里面涉及到的概念有:原型、原型对象、构造函数、对象(实例)、prototype、proto、constructor。
他们之间的关系是怎样的呢?
- 首先,当我们创建一个大写字母开头的函数的时候,这个函数就是构造函数;
- 当我们
new
一个这个构造函数的实例对象的时候,这个实例就是我们说的对象(实例),它具有 proto 属性; - 原型和原型对象是一回事,他们是基于构造函数
new
出来的对象,也就是函数对象而存在的,它具有prototype
属性; - 原型和原型对象也有一个
contructor
属性(或者叫做指针),它指向关联的构造函数。 - 每一个对象都有一个 proto 属性指向原型对象,这个原型对象还可以有它自己的原型,以此类推,形成了一个原型链。当查找特定属性的时候,先去这个对象里面查找,如果没有找到,那么就去它的原型对象里面找,如果还是没有,再去原型对象的原型对象里面去查找。这个操作被委托在整个原型链上,也就是我们所说的原型链了。