js apply、call、bind 用法实践+解析

作用: 改变对象的this指向 ,调用指定对象的属性

 使用方法有两种(参数不一样):
     1、把目标 obj 作为参数传入,默认获取该 obj 的 this 指向
         
         把 obj 的 this 指向,给我拿来: .call(obj):    	    立即执行,不需要手动执行
         把 obj 的 this 指向,给我拿来: .apply(obj):  		立即执行,不需要手动执行
         把 obj 的 this 指向,给我拿来: .bind(obj)():  	    不立即执行,需要手动执行 加 ()

     2、被借用的 obj ,作为函数调用主体时,需要指定借用了谁的 this (targetObj)

         obj.call(targetObj,[  ...arguments ]):    立即执行,不需要手动执行
         obj.apply(targetObj, [ array ]):          立即执行,不需要手动执行
         obj.bind(targetObj, [ ...arguments ])():  不立即执行,需要手动执行 加 ()
 // 第一种方法 直接调用指定对象的属性
 
 let obj = {
     name: 'obj',
     age: '12',
     say: 'hi'
 }

 let obj1 = {
     run: function () {
         // obj1 并没有声明 this.name this.age this.say 属性
         console.log(`${this.name} 今年 ${this.age} 岁,说 ${this.say}`)
     }
 }
 
 // 主动借用对象(obj1),作为apply函数调用主体时,默认,把参数(obj)的this属性借给主动调用对象(obj1)
 obj1.run.call(obj) // obj 今年 12 岁,说 hi
 obj1.run.apply(obj) // obj 今年 12 岁,说 hi
 obj1.run.bind(obj)() // obj 今年 12 岁,说 hi


 // 第二种方法 可实现工厂模式
 
 // 定义公共属性
 function Person(name,age,gender) {
     this.name = name,
     this.age = age ,
     this.gender = gender  
 }

 // 包含自身属性与公共属性
 function Ming (name,age,gender,say) {  
     // 自身属性
     this.say = say
     this.run = function() {
         console.log(`${this.name} 今年 ${this.age} 岁,${this.gender} , ${this.say}`)
     }
	
	 // 调用函数,改变this指向,借用Person的属性
     // 被借用对象(Person),作为apply函数调用主体时,需要指定借用this属性的是谁,
     // 当前借用对象是 Ming ,即 this ,这里如果不声明借用对象,则无法借用,输出undefined
     
     // Person.call(this,...arguments) 
     // Person.bind(this,...arguments)()
     Person.apply(this,[...arguments])
     
	 // 不声明借用对象,借用失败,除了 say ,其它属性并没有定义,输出 undefined
     // Person.apply('',[...arguments]) undefined 今年 undefined 岁,undefined , hello
 } 

 // 借用Person的属性,实例化对象,同时使用公共属性和声明自身属性
 let newMing = new Ming('明',12,'男','hi')
 let newMin = new Ming('敏',14,'女','hello')
 newMing.run() // 明 今年 12 岁,男 , hi
 newMin.run() // 敏 今年 14 岁,女 , hello

/**
区别: call 的第二、第三个参数,用逗号分隔;
apply 的第二个参数,必须是数组;
bind 返回的是一个函数,必须手动调用才执行。
*/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值