一、什么是构造函数

  在JavaScript中,用new关键字来进行调用的函数称为构造函数,一般首字母要大写。例如:

function Person(name,age){
        this.name=name;
        this.age=age;
        this.say=function(){
            console.log('我是人')
        }
    }

二、构造函数的意义

  使用对象字面量创建一系列同一类型的对象时,这些对象可能具有一些相似的特征(属性)和行为(方法),此时会产生很多重复的代码,把这些重复性的特征和属性抽象出来,做成构造函数,可以实现代码复用。举个浅显的例子,比如要生产10000个不同的纸盒子,如果按照常规的方法,就需要手动裁10000次纸,画10000次图案,这样太费时费工,而且如果数量进一步扩大,会造成更大的麻烦。但是如果造一个机器,机器中有盒子的模型,在造盒子之前只需要将盒子的尺寸和图案当做参数输入进去,那么生产盒子的效率就会大幅提高,盒子生产出来之后里边装什么东西,再进行差异化处理就行,需要汉堡的时候放汉堡,需要放披萨的时候放披萨,各自使用就好。这里边这个机器就相当于构造函数,可以反复使用生产一些自带属性和特征的初始对象。

三、实例成员和静态成员

function Person(name,age){//Person是一个构造函数
        /*构造函数中,实例成员就是构造函数内部通过this添加的成员,name、age、say就是实例成员(个人理解就是构造函数在实例化以后可以访问的成员)*/
        this.name=name;
        this.age=age;
        this.say=function(){
            console.log('我是人')
        }
    }
    Person.height='165';//在构造函数上添加的成员就成为静态成员

    var p1=new Person('张三',25);//实例化对象

    /*通过prototype添加的成员不是静态成员,是实例成员,也就是只要是实例化的对象都可以访问到*/
    Person.prototype.weight='70kg';
    console.log(p1.weight);//70kg
    console.log(Person.weight);//undefined

    /*静态成员只能通过构造函数进行访问*/
    console.log(Person.height);//输出165
    console.log(p1.height);//输出undefined

    /*实例成员只能通过实例对象进行访问*/
    console.log(p1.name);//输出张三
    p1.say();//输出我是人
    console.log(Person.age);//输出undefined
    Person.say();//报错,Person.say is not a function

 注意问题:

1.构造函数最好首字母大写,但是小写也不会影响程序执行

2.通过prototype为构造函数添加或者修改的属性和方法,访问到哪个内容主要是看访问的位置是在属性和方法添加之前还是之后,和实例化对象的位置没有关系。