构造函数

在JavaScript中,通过new来实例化对象的函数叫构造函数(函数没有通过new实例化对象,这个函数就是普通函数),也就是初始化一个实例对象,对象的prototype属性
是继承一个实例对象。构造函数的命名一般会首字母大写

为什么需要使用构造函数?

是为了创建对象
JavaScript中创建对象有两种,一种是构建函数+prototype,另一种是用class。.这里我们不去讲解class,先放到
构造函数上。

1
2
3
4
5
//当我们需要创建比较多信息时
var person1={name:'aa',age:6,gender:'男'classRoom:'高-'}:
var person2={name:'bb',age:6,gender:'女'classRoom:'高-'};
var person3={name:'cc',age:6,gender:'女'classRoom:'高-'};
var person4={name:'dd',age:6,gender:'男'classRoom:'高-'};

那么如果需要创建很多呢?需要这样一个一个的写下去吗?但是实际上可以通过下面的形式来实现

1
2
3
4
5
6
7
8
9
10
11
function Person(name,age,gender,classRoom){
this.name name;
this.ageage;
this.gender gender;
this.classRoom='高一'
}
Person.prototype.sayHi function ()
console.log("你好,我叫"+this.name+"是一个"+this.sex+"来自"+classRoom);
};
let person1=new Person("a",l8,'男');//我们还可以不传classRoom,让他使用默认的
let person2=new Person("b",l9,'女');

构造函数的执行过程

构造函数的执行过程其实也就是new操作符的基本过程

  • 创建一个新的对象,并且在内存中创建一个新的地址。//let person1=0:
  • 继承原型//person1.proto=Person.prototype
  • 改变构造函数的this指向,并且新对象添加构造函数的属性和方法/执行Person函数,将name,age,sex参数传
    入Person中执行,此时函数内部this为new创建的person1对象,所以person1.name=’a’;person1.age=l8;
    person1.gender=-‘男’;
  • 根据构建函数返回类型作判断,如果是原始值则被忽略,如果是返回对象,需要正常处理new操作符通过构造函数创建的实例,可以访问构造函数的属性和方法,同时实例与构造函数通过原型链连接起来了。

构造函数的返回值

构造函数中,不要显示返回任何值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//返回原始值
function Person(name){
this.namename;
return'啦啦啦啦'
}
let person1 = new Person("a");
console.log(person1.name)//a
//返回对象
function Person(name){
this.name name;
return {
aaa:"asdas"
}
}
let person1 = new Person("a");
console.log(person1)//faaa "asdas"}
console.log(person1.name)//'undefined'

可以看到当返回原始值的时候,并不会正常返回这个原始值“啦啦啦啦”,而当返回直是对象的时候,这个返回值能
被正常返回,但是这时候new就不生效了。所以,构造函数尽量不要返回值。因为返回原始值不会生效,返回对象
会导致new操作符没有作用。

那么为什么会这样呢?

构造函数没有返回值的原因是因为它不是由你的代码直接调用的,它是由运行时的内存分配和对象初始化代码
调用的。它的返回值(如果它在编译为机器代码时实际上有一个)对用户来说是不透明的一因此,你不能指
定它。
其实在JavaScript中,

  • let a=0也就是let a=new Array[];
  • function a(){}也就是let a=new Function(){}