this参数以及构造函数

this参数

解析器(浏览器)在调用函数时每次都会向函数内部传递一个隐含的参数
    这个隐含的参数就是this,this指向的是一个对象
    这个对象我们称为函数执行的上下文对象

根据函数的调用方式的不同,this会指向不同的对象

  1. 以函数的形式调用时,this永远都是window
  2. 以方法的形式调用时,this就是调用方法的那个对象 谁调用,this就是谁
  3. 当以构造函数的形式调用时,this就是新创建的那个对象

构造函数

  1. 一般首字母大写(不是强制要求的,但是尽量大写 ,如这里的Person)

    构造函数与普通函数的区别就是调用方式不同
    普通函数是直接调用,而构造函数需要使用new关键字调用
    
  2. 使用同一个构造函数创建的对象,我们称为一类对象,也将一个构造函数称为一个类
             我们将通过一个构造函数创建的对象,称为是该类的实例

  3. instanceof
 instanceof可以检查一个对象是否是一个类的实例
        语法:
            对象 instanceof 构造函数
                    如果是,则返回ture,否则返回false

执行流程

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

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

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

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

实例:

使用构造函数可以解决工厂方法中所有对象都是object类型的问题
如例子中分了两个类 一个person和一个dog
这样可以使我们更方便区分不同类型的对象
    function Person (name , age , gender){

            this.name = name;
            this.age = age;
            this.gender = gender;
            this.sayName = function(){
                alert(this.name);
            };
    }

    function Dog (){

    }

    var per = new Person("孙悟空",18,"男");
    var per2 = new Person("白骨精",16,"女");
    var per3 = new Person("猪八戒",38,"男");

    var dog = new Dog();

    console.log(per);
    console.log(per2);
    console.log(per3);

    console.log(dog);

    console.log(per instanceof Person);
问题:
  • 问题一

    代码中第5~7行中使用如下代码

this.sayName = function(){alert(this.name);};

       直接在Person类中创建sayName方法有一点弊端,那就是代码执行几次,就创建多少个sayName方法
       而且创建的sayName方法都是唯一的,但是在这里根本就没有必要创建这么多sayName方法
           可以使用原型对象来解决

  • 问题二

    以上代码编写没有错误,可能使浏览器的原因,火狐浏览器中控制台返回的还是object
    这里写图片描述
    然后在另一个浏览器中控制台没有问题
    这里写图片描述

这是第二张图的代码

function Person(){
                this.name = "ll";
            }

            var per = new Person();

            console.log(per);

猜你喜欢

转载自blog.csdn.net/kj981102/article/details/82426289