什么是构造函数
1.定义
用 new 关键字来调用的函数,称为构造函数
2.要求
- 构造函数首字母一般要求大写
其实大小写都可以,不过大写是为了别人看见这个之后,知道这是个构造函数
3.用途
构造函数主要用来创建对象
一般把对象中一些公共的属性和方法抽取出来,然后封装到这个函数里面
function Person() {
}
var person1 = new Person();
console.log(typeof person1); //object
4.好处
用函数创建对象,可以减少繁琐的对象创建流程,从而实现代码的复用
var person1 = {
name:'a',
age: 18,
};
var person2 = {
name: 'b',
age: 19,
};
var person3 = {
name: 'c',
age: 20
};
function Person(name, age) {
this.name = name,
this.age = age
}
var person4 = new Person('d', 18);
var person5 = new Person('e', 19);
var person6 = new Person('f', 20);
//如果创建1000个人都使用对象字面量的方式就会产生很多重复的代码
//而使用构造函数就会避免这种重复的产生
静态成员和实例成员
构造函数可以添加一些成员,这些成员可以在构造函数本身上添加,也可以在构造函数内部的 this 上添 加。通过这两种方式添加的成员,就分别称为静态成员和实例成员
- 静态成员:在构造函数本上添加的成员称为静态成员,只能由构造函数本身来访问
- 实例成员:在构造函数内部创建的对象成员称为实例成员,只能由实例化的对象来访问
实例成员也就是构造函数内部通过this添加的成员
function Person(name, age) {
//name、age都是实例成员
this.name = name,
this.age = age
}
//静态成员
Person.school = 'school';
var person1 = new Person('a', 18);
console.log(person1.school); //undefined
console.log(Person.school); //school
console.log(Person.age); // undefined
console.log(person1.age); //18
new 的作用
new 在执行时会做四件事情:
1.调用关键字 new 时,会在内存中开辟一个新的空间,用来存放这个对象
2.让 this 指向这片内存(也就是 this 指向这个对象)
3. 执行构造函数里面的代码,给这个新对象添加属性和方法
4.默认返回 this ,也就是将这块内存空间返回(this 已经指向了这块内存空间)(所以构造函数里面不需要写 return )
function Person(name, age) {
//var this = {}
this.name = name,
this.age = age
// return this
}
关于 return
如果出现了return,返回的是原始值的话,会直接忽略掉;但如果是一个对象的话,则会返回这个对象
function Person(name, age) {
this.name = name,
this.age = age
return 123
}
var person1 = new Person('a', 18);
console.log(person1); //Person {name: "a", age: 18}
function Test(name, age) {
this.name = name,
this.age = age
return {
name: '武汉加油',
age: 2020
}
}
var test = new Test('a', 18);
console.log(test); //{name: "武汉加油", age: 2020}
所有的对象最终都是通过构造函数创建的
var arr = [1, 2, 3, 4, 5];
// 相当于下面的
var arr = new Array(1, 2, 3, 4, 5);
var obj = {
name: 'a',
age: 18
};
// 相当于
var obj = new Object();
obj.name = 'a';
obj.age = 18;
如何判断某个函数是否通过 new 来调用
new.target 该表达式在函数中使用,返回的是当前的构造函数,但是是,如果该函数不是通过new 调用的,则返回 undefined
通常用于判断某个函数是否通过 new 在调用,不通过时返回 undefined
function Person() {
console.log(new.target)
}
var test1 = Person(); //undefined
var test2 = new Person(); //Person(){...}
防止没有函数通过 new 调用
function Person(name, age, sex) {
if(new.target === 'Person') {
this.name = name;
this.age = age;
this.sex = sex;
} else {
return {
name,
age,
sex
}
}
}
函数的本质
函数的本质就是对象
所有的函数都是通过new Function
创建的
Function -> 产生的函数对象 -> 产生普通的对象
由于函数本身就是对象,因此函数中,可以拥有各种属性
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.a = 123;
console.log(Person.a); //123
Person.test = function() {
console.log('test');
}
Person.test(); //test