乐趣区

原型与原型链

一、构造函数

构造函数是一个普通函数,创建方式与普通函数没有区别,不同的是构造函数习惯首字母大写。另外,调用方式不同,普通函数直接调用,构造函数则是通过 new 关键字调用。

每创建一个 Person 构造函数,在 Person 构造函数中,为每一个对象都添加了一个 sayName 方法,也就是说构造函数每执行一次就会创建一个新的 sayName 方法。这样就导致了构造函数执行一次就会创建一个新的方法,执行 10000 次就会创建 10000 个新的方法,而 10000 个方法都是一摸一样的,为什么不把这个方法单独放到一个地方,并让所有的实例都可以访问到呢? 这就需要原型 (prototype)。

二、原型

在 javascript 中,每一个函数数据类型都天生自带一个 prototype 属性,这个属性指向了函数原型对象,并且这个属性是一个对象数据类型的值。原型的属性或方法会被原型实例所共享。通过原型创建的原型实例是独立的。

三、原型链

1.__proto__和 constructor

每一个对象数据类型(普通对象、实例、prototype)也天生自带一个属性__proto__,属性值是当前实例所属类的原型(prototype)。原型对象中有一个属性 constructor,它指向函数对象。

2. 何为原型链

万物皆对象,对象之间的继承关系,是通过 prototype 对象指向父类对象,直到指向 Object 对象为止,这样就形成了原型链。

当我们访问对象的一个属性或方法时,它会先在对象自身查找,如果有则直接使用,如果没有就会去原型对象中查找,如果找到就直接使用。如果没有就去原型的原型中查找,找到为止。如果在 Object 原型中还没有找到,就返回 undefined。

退出移动版