JS的学习

对象进阶

2021-12-01  本文已影响0人  wy22

1.this

构造函数里面的this,用于给类定义成员(属性和方法)

方法里面的this,指向方法的调用者

箭头函数中没有this,如果在箭头函数中使用了this,会向外层寻找this的指向

如果所有的外层都没有this,最终会指向window对象

  // 注意:构造函数不能使用箭头函数定义

        function Person(name,age){

            // 在构造函数中,this关键字,用于给类添加成员

            this.name = name

            this.age = age

            this.sayHi = function(){

                console.log(`大家好!我叫${this.name},今年${this.age}岁`);

            }

        }

        // 创建对象,该对象会拥有,类型中定义的所有成员。

        let p1 = new Person('张三',20)

        console.log(p1);

        p1.sayHi()

        let p2 = new Person('李四',24)

        console.log(p2);

        p2.sayHi()

        console.log('-----------------------------------------');

        let obj1 = {

            //对象的两个属性

            name:'肖战',

            age:20,

            //对象的方法

            sayHi:function(){

                // 在方法中,this指向方法的调用者,谁在调用该方法,this就指向谁

                // 如果一个方法,不是由对象调用执行的,而是直接执行的,那么该方法里面的this就执行window对象

                console.log(`Hi!我是${this.name},今年${this.age}岁`);

            },

            sayHello:()=>{

                // 在箭头函数中没有this,如果在箭头函数中使用了this,它会向上一层函数中去找this

                // 如果上一层函数也是箭头函数,或者没有上一层函数了,这个时候this就指向window对象。

                console.log(`Hello!我是${this.name},今年${this.age}岁`);

            }

        }

        obj1.sayHi()

        let obj2 = {

            name:'关晓彤',

            age:22,

        }

        //可以将obj1的函数传给obj2,其实是obj2的sayHi方法,指向obj1的方法

        obj2.sayHi = obj1.sayHi

        obj2.sayHi()

        //将obj1身上的函数,传给了一个sayHi变量

        let sayHi = obj1.sayHi

        window.name = '小明'   //设置window对象的name属性

        window.age = 22        //设置window对象的age属性

        sayHi()

  // var 定义的成员,会自动添加为window对象的成员

2.call apply bind

call apply bind 更改方法里面this的指向

1.使用call()改变方法里面,this的指向

call()方法的第一个参数必须是指定的对象,方法的原有参数,挨个放在后面

2.使用apply(),也可以改变方法里面this的指向,第一个参是指定的对象,方法的原有参数,统一放到第二个数组参数中。

3.使用bind(),也可以改变方法里面this的指向,用法给call()一样

call()是直接运行方法,bind()是返回新的方法,然后再重新调用。

上一篇下一篇

猜你喜欢

热点阅读