js基础知识(十四)--this、工厂方法创建新的对象、构造函数

一、this
在调用函数时,浏览器每次都会向函数中传递一个隐含的参数这个参数的名字叫做this,this指向的是一个对象!
this到底是谁呢?
1.当我们以函数的形式调用一个函数时,this是window
2.当我们以方法的形式调用一个函数时,this是调用方法的对象
注意:调this就是调用方法的对象,当我们不确定方法对象是谁的时候,我们就需要用到this,this的作用就相当于谁是谁,哪个谁不确定,谁调用this就是谁

    // 设置一个全局变量name
    var name = '全局name属性';

    //定义一个对象(方法),对象里面包含着函数的就叫方法,对象的属性是函数,则我们称这个函数是这个对象的方法(method)
    var obj = {
        name: '孙悟空',
        sayHello: fn//这个sayHello直接调用了fn函数 跟 sayHello:function fn(){}一样
    };
    //写在外面就是 obj.sayHello=function fn(){}

    var obj2 = {
        name: '猪八戒',
        sayHello: fn
    };

    //console.log(obj.sayHello === fn);//true

    // 三个打印结果一样
    // obj.sayHello();
    // obj2.sayHello();
    // fn();

    /*
    修改,我们希望:
    obj.sayHello()----->孙悟空--->obj.name
    obj2.sayHello();----->猪八戒--->obj2.name
    window.fn();----->全局name属性--->window.name
    谁调用的方法就打印谁的name属性
    */
    // 定义一个函数,通过函数,然后this来调用他们的方法,var name = '全局name属性'(函数形式); 
    function fn() {
        console.log(this.name);
    }
    obj.sayHello();//孙悟空 以方法的形式调用一个函数时(调用obj对象的sayHello()的方法),this是调用方法的对象
    obj2.sayHello();//猪八戒
    window.fn();//全局name属性 以函数的形式调用一个函数时,this是window

    //练习
    name_test = '沙和尚';
    let obj3 = {
        name_test: '孙悟空',//obj3.name,打印的时候不会去属性里去找
        sayHello: function () {
            // // 找变量
            // alert(name_test);
            // 找属性
            alert(this.name_test);
        }
    }
    // obj3.sayHello();//沙和尚
    obj3.sayHello();//孙悟空

二、工厂方法创建新的对象
/*
工厂方法:根据参数创建新的对象
创建一个函数,专门用来创建人类的对象(函数里面放一个对象,而函数开头是可以放形参的)
*/

    function createPerson(name, age, gender, address, sayHello) {
        //创建一个对象
        let obj = {
            name,
            age,
            gender,
            address,
            sayHello() {
                alert(`大家好,我是${this.name}`);
            }
            //与下面写法等价
        };
        // // 向对象中添加属性
        // obj.name = name;
        // obj.age = age;
        // obj.gender = gender;
        // obj.address = address;
        // obj.sayHello = function () {
        //     alert(`大家好,我是${this.name}`);
        // }
        // 将对象作为返回值返回
        return obj;
    }

    let per_1 = createPerson('孙悟空', 18, '男', '花果山');
    let per_2 = createPerson('猪八戒', 28, '男', '高老庄');
    let per_3 = createPerson('沙和尚', 38, '男', '流沙河');
    per_1.sayHello();
    console.log(per_1);
    console.log(per_2);
    console.log(per_3);

三、构造函数
可以通过构造函数来创建对象
1.构造函数就是专门用来创建对象的函数(自定义函数是用构造函数)
2.构造函数的定义方式和普通函数没有区别,唯一的不同点在于构造函数的名字首字母要大写
3.构造函数和普通函数的区别在于调用方式,一个函数如果直接调用那么它就是一个普通函数,如果使用new关键字调用,它就是一个构造函数
4.一个构造函数也称为是一个类,通过该构造函数所创建的对象,称为该类实例,通过同一个类创建的对象,称为同一类对象

构造函数的执行流程:1.创建一个新的对象;2.将这个新的对象设置为函数中的this;3.执行函数中的代码;4.将新建的对象返回

instanceof,用来检查一个对象是否是一个类的实例
语法:对象 instanceof类(构造函数)例如:per instanceof Person

function Person(name) {
        this.name = name;
    }
    function Dog(age) {
        this.age = age;
    }
    // Person()//普通函数调用方式
    // new Person()//构造函数调用方式
    let Per = new Person('swk');//Per是Person类的实例
    let Per2 = new Person('zbj');
    let Dog_test = new Dog(18);
    // 可以一眼看出是那个对象
    console.log(Per);//Person{name:'swk'}
    console.log(Per2);//Person{name:'zbj'}
    console.log(Dog_test);//Dog{age:18}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值