在说构造函数之前,我们先讲一讲面向对象编程。所谓的面向对象编程,是一种编程思想和书写方式方法,它是将程序封装在对象内,并给对象设置属性和属性值。而这个封装程序的对象我们称之为实例化对象,而生成实例化对象的函数就是构造函数。
一般情况下,为了和普通函数区别,我们将构造函数的首字母大写。
接下来我们说说定义构造函数,在函数内,定义实例化对象的方法,通过的是this来指定定义实例化对象的属性:this.属性=属性值。而方法,我们设定在prototype中。在ES5中,我们定义方法是通过:构造函数.prototype.函数方法名 = function(){} 来定义。我们来看下面的代码。
function Fun1(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
Fun1.prototype.f1 = function(){
console.log(this.name,this.age,this.sex);
}
这是一个简单的构造函数,当我们调用这段代码时会生成一个实例化对象:
const obj1 = new Fun1('张三',18,'男');
obj1.f1();
我们来看一看运行结果
总结一下:ES5的构造函数就是将我们需要的数据存储在对象的属性中,然后将方法存储在构造函数的prototype中,当我们调用数据时通过实例化对象的属性获取,调用方法时,对象中没有的方法会去实例化对象中寻找__proto__,而在__proto__中存储着构造函数的prototype中的方法,因此我们直接使用“实例化对象.方法”就可以调用我们提前设置好的函数。
ES5中的构造函数有一些小问题,它的prototype属性是定义在函数外面的,那么我们调用构造函数就需要在定义prototype的语句之后进行调用,否则我们生成的实例化对象中就只有属性而没有函数方法。而在ES6中,新增了语法形式:class类,这是一种新的定义函数的语法,它的原理和ES5的原理完全相同,区别只是格式不同。
接下来我们使用ES6写出和上面相同的效果:
class Fun2{
constructor(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
f2(){
console.log(this.name,this.age,this.sex); }
}
在ES6中,我们将所有的构造函数都写在class中,在constructor中写入我们需要的数据,然后直接在下面写入需要的方法函数即可,它的功能与ES5相同,最终效果也相同。
const obj2 = new Fun2('李四',19,'女');
obj2.f2();
很显然,ES6的语法更简洁,推荐大家使用ES6的语法格式。