JS 构造函数 基础

构造函数

JS 构造函数 基础
这就是最简单的一个构造函数,习惯上首字母大写,其实和一般的函数没有什么区别
但是,最大的区别是在对象新建的时候
构造函数需要使用new关键字
而普通函数却不需要使用,就比如下图
JS 构造函数 基础
接下来说说我们为什么要使用构造函数
上节在工厂方法中发现,通过工厂方法创建的对象都是Object类型的,让我们很难区分我们创建的对象是什么类型。
比如我创建一个动物,它是Object类型
我创建一个人物,它也是Object类型
所以我们需要用到构造方法来加以区分
我们先来看下面这张图骗的运行效果

JS 构造函数 基础
JS 构造函数 基础
很明显 它是Person类型的,也就是现在我们可以通过构造函数创建可以区分的类型。
接下来我们再来看构造函数执行的流程:
1.立刻创建一个新的对象
2.将新建的对象设置为函数中的this,所以在构造函数中可以使用this引用新建的对象
3.逐行执行函数中的代码
4.将新的对象作为返回值返回JS 构造函数 基础
运行结果:JS 构造函数 基础

可以看出构造函数中的this指向了新建对象,所以p.name会输出程序员1

但是在给p.name赋值的时候,我们是在构造函数中进行的,假如我们需要创建n个对象,那么我们就需要写n个赋值语句,this.name=“…”…,又产生了冗余,占用了大量空间,所以我们采取传参的形式代替这种复杂的方式
如下图:
JS 构造函数 基础
JS 构造函数 基础
通过这种方法我们就可以快速的创建多个对象

再来看下面的例子:
JS 构造函数 基础

在构造函数内部添加了一个函数,输出自己自定义的一些东西。
p p1 p2 三个对象同时都有这个方法
也就是每执行一次就会创建一个新的setage方法,执行999次,就会创建999次这样的方法,所以我们需要对这个写在构造函数内部的函数进行优化
如下
JS 构造函数 基础
我们将构造函数内部的函数放到了全局作用域当中,但是,此时又有问题 就是,将这个函数放在了全局作用域当中的话,会污染了全局作用域的命名空间,而且定义在全局作用域中也很不安全,所以我们需要使用原型。