浅析构造函数,原型及原型链

一.构造函数

所谓的构造函数,个人理解其实就是一个普通函数,只不过我们用它来专门生产对象,这样的函数,我们称之它为构造函数。类似与php中class类的作用;它提供模板,描述生成对象的基本结构

演示代码:

bk1.png

解析 构造函数代码 的执行

而要创建 Person 实例,则必须使用 new 操作符。而以这种方式调用构造函数会经历以下 5 个步骤:

1.创建一个空对象,作为将要返回的对象实例

2.将这个空对象的原型,指向构造函数的prototyoe属性。

3.将这个空对象赋值给函数内部的this关键字。

4.执行构造函数的内部代码。

5.返回新对象

演示代码:

bk2.png

二.构造函数和实例对象的关系

构造函数是根据具体的事物抽象出来的抽象模板

实例对象是根据抽象的构造函数模板得到的具体实例对象

实例对象由构造函数而来,一个构造函数可以生成很多具体的实例对象,而每个实例对象都是独一无二的;

每个对象都有一个 constructor 属性,该属性指向创建该实例的构造函数

演示代码:

bk3.png

三.原型

1>构造函数的 prototype属性

1.JavaScript 的每个对象都继承另一个父级对象,父级对象称为 原型 (prototype)对象。

2.原型也是一个对象,原型对象上的所有属性和方法,都能被子对象 (派生对象) 共享

3.通过构造函数生成实例对象时,会自动为实例对象分配原型对象。

4.而每一个构造函数都有一个prototype属性,这个属性就是实例对象的原型对象。

备注:null没有自己的原型对象。

也就是说,我们可以把所有对象实例需要共享的属性和方法直接定义在构造函数的 prototype 属性上,也就是实例对象的原型对象上。

演示代码:

bk4.png

这时所有实例的 name 属性和 sayhello() 、saycolor 方法,其实都是同一个内存地址,指向构造函数的 prototype 属性,因此就提高了运行效率节省了内存空间。

四.构造函数、实例、原型三者之间的关系

bk5.png
bk6.png

五.原型及原型链

所有对象都有原型对象;

演示代码:

bk7.png

对象的属性和方法,有可能是定义在自身内,也有可能是定义在它的原型对象上。
由于原型本身也是对象,又有自己的原型,所以形成了一条 原型链(prototype chain)。

注意:不在要原型上形成多层链式查找,非常浪费资源;

六.更简单的原型语法

为减少不必要的输入,更常见的做法是用一个包含所有属性和方法的对象字面量来重写整个原型对象:

bk8.png

在该示例中,我们将 Person.prototype 重置到了一个新的对象。这样做的好处就是为 Person.prototype 添加成员简单了,并且保持了 constructor 的指向正确。

你可能感兴趣的:(浅析构造函数,原型及原型链)