JS基础笔记-关于构造函数

140 阅读2分钟

构造函数

构造函数就是一个普通的函数,不同的是
1.构造函数首字母大写
2.构造函数调用方式不同,需要用new关键字来调用

构造函数的执行流程:

1.立刻创建一个新的对象;

2.将新建的对象设置为函数中的this;

3.逐行执行函数中的代码;

4.将新的对象作为返回值返回;

使用同一个构造函数创建的对象,称为一类对象(一个构造函数称为一个类); 我们将通过一个构造函数创建的对象,称为是该对象的实例

    function Person() {
    }

    //没有用new关键字;
    var per = Person();
    console.log(per);//undefined


    //用new关键字;
    var per1 = new Person();
    console.log(per1); //Person {}

关于构造函数的this——将新建的对象设置为函数中的this;

    function Person() {
      console.log(this);//Person {}
    }

    var per1 = new Person();
    console.log(per1); //Person {}

创建一个构造函数

var name = '11';
    function Person(name, age) {
      this.name = name;
      this.age = age;
      this.sayName = function () {  //每一个Person中都添加了一个构造函数内部定义的方法,构造函数每执行一次,都会创建一个新的方法;完全没有必要,可以共享一个方法;
        alert(this.name);
      }
    }
    
    
    //创建Person的实例per1,per2
    
    var per1 = new Person('xixi', 19);
    var per2 = new Person('asas', 18);
    console.log(per1); //Person {name: 'xixi', age: 19, sayName: ƒ}
    
    console.log(per1.sayName == per2.sayName);// false
    

提取方法,性能可以提升,占用空间少,但是也会有问题-后面继续了解原型对象解决这个问题

    //定义了全局方法,会污染全局作用域的空间,也不安全,尽量不要写全局
    
    function fun() {
      alert(this.name);
    }
    
    
    function Person(name, age) {
      this.name = name;
      this.age = age;
      this.sayName = fun;
    }
    
    console.log(per1.sayName == per2.sayName);// true
    

instanceof 可以用检查一个对象是否是另一个对象的实例

    //instanceof 可以检查per1是否为Person的实例
    console.log(per1 instanceof Person);//true  
    console.log(per1 instanceof Object);//true  老祖宗,所有的构造函数都是Object的后代

关于this的总结

  • 当以函数的形式调用时,this是window

  • 当以方法的形式调用时,谁调用方法this就是谁

  • 当以构造函数的形式调用时,this就是新创建的那个对象