什么是构造函数?
构造函数是对一个实例的描述,是一种特殊的方法,主要是用来在创建对象时对其进行初始化,也就是为对象成员变量赋初始值,与new运算符一起可用来创建实例对象,一个类可以有多个构造函数,根据参数个数的不同或者参数类型的不同来区分它们,即构造函数的重载。
function Person(name){
this.name=name }; //这是一个构造函数
var person1=new Person('Jone') //构造函数new出来的实例
var person2=new Person('li') //构造函数new出来的实例
①这里的person1,person2都是一个实例,通过new一个构造函数去实例化出来的一个对象
②Person就是一个类,也是一个构造函数
总的来说它具体有以下几个特点:
1.构造函数必须与类的名字相同,并且一般是没有返回值的
2.每个类可以有多个构造函数,当开发人员没有提供构造函数时,编译器在把源代码编译成字节码的过程中会提供一个没有参数默认的构造函数,但是该构造函数不会执行任何代码,如果开发人员提供了构造函数,那么编译器就不会再默认创建构造器了
3.构造函数可以有0个,1个或者1个以上的参数
4.构造函数总是伴随着new操作一起调用,并且不能通过程序的编写者直接调用,必须要由系统调用,构造函数在被实例化时会被自动调用,并且只执行一次,而普通的方法是在程序执行到它时被调用,且可以被对象调用多次
5.构造函数的主要作用是完成对象的初始化工作
6.构造函数不能被继承,因此它不能被覆盖,但是它可以被重载,也就是使用不同的参数个数或参数类型来定义多个构造函数
7.子类可以通过super关键字来显式地调用父类的构造函数,当父类提供有参数的构造函数时,子类的构造函数中必须显式地调用父类的构造函数。如果父类提供了无参数的构造函数,此时子类的构造函数就可以不显式地调用父类的构造函数,在这种情况下编译器会默认调用父类提供的无参数的构造函数。当有父类时,在实例化对象时会先执行父类的构造函数,然后执行子类的构造函数。
当父类和子类都没有定义构造函数时,编译器会为父类生成一个默认的无参数的构造函数,给子类也生成一个默认的无参数的构造函数。此外,默认构造器的修饰符只跟当前类的修饰符有关(例如,如果一个类被定义为public,那么它的构造函数也是public)。
为什么说属性在构造函数中声明,方法在原型中声明?
因为在构造函数中声明后,通过new关键字实例化出来的实例都是单独享有的,所以属性在构造函数中声明;又因为方法大家都是共用的,而且不经常改变,所以,方法可以在prototype中声明。当然方法也可以在构造函数中声明
①在构造函数中声明是为了属性能单独享有
②在构造函数的proptotype中声明是为了实例能共享
分别向实例对象和对象构造器中添加属性和方法
1.为创建的实例对象添加属性和方法 -----直接 ' . '
属性:
myFather.nationality = "English";
方法:
myFather.name = function () { return this.firstName + " " + this.lastName;};
也就是直接 实例名.属性=值/函数 的方式
2.为构造函数添加属性和方法
①如需向构造器添加一个新属性,必须添加到构造器函数 ------- (直接写进构造函数)
与向已有对象添加新方法不同,您无法为对象构造器添加新方法,必须在构造器函数内部向一个对象添加方法:
例如以下代码:this.nationality = "English";就是为构造函数添加的新属性,
this.name = function() {return this.firstName + " " + this.lastName;};就是为构造函数添加的新方法
function Person(first, last, age, eyecolor) {
this.age = age;
this.eyeColor = eyecolor;
+ this.nationality = "English";
+ this.name = function() {return this.firstName + " " + this.lastName;};
}
②使用 prototype 属性 ------- 通过 ( 类名.proyotype.属性=值 ) 添加
JavaScript prototype 属性允许为对象构造器添加新属性:
function Person(first, last, age, eyecolor) {
this.age = age;
this.eyeColor = eyecolor;}
Person.prototype.nationality = "English";
JavaScript prototype 属性也允许为对象构造器添加新方法:
function Person(first, last, age, eyecolor) {
this.age = age;
this.eyeColor = eyecolor;}
Person.prototype.name = function() { return this.firstName + " " + this.lastName;};
网友评论