JS基础----call和apply方法、代理Proxy的使用、JS中defineProperty用法

JS基础----call和apply方法、代理Proxy的使用、JS中defineProperty用法

一 JS中call()和apply()

call()和apply()这两个方法的作用可以简单归纳为改变this指向。
this指向是老生常谈的问题,一般可以狭义的理解为 是谁调用了,this就指向谁

<script>
  let objFlx = {
    name: "flx",
    age: 100,
    getInfo(info) {
      console.log("姓名:", this.name);
      console.log("年龄:", this.age);
      console.log("信息", info);
    }
  }
  let objCxy = {
    name: "cxy",
    age: 100,
    getInfo(info) {
      console.log("姓名:", this.name);
      console.log("年龄:", this.age);
      console.log("信息", args);
    }
  }
  // 正常的调用,结果是正常打印
  objFlx.getInfo('男');
  objCxy.getInfo('女');
</script>
<script>
  // 使用apply() 与 call()方法,改变this指向
  let objFlx = {
    name: "flx",
    age: 100,
    getInfo(info) {
      console.log("姓名:", this.name);
      console.log("年龄:", this.age);
      console.log("信息", info);
    }
  }
  let objCxy = {
    name: "cxy",
    age: 100,
    getInfo(info) {
      console.log("姓名:", this.name);
      console.log("年龄:", this.age);
      console.log("信息", args);
    }
  }
  // 正常的调用,结果是正常打印
  objFlx.getInfo.call(objCxy,"使用了call函数的women");
  // 打印结果为:
  // 姓名: cxy    年龄:100   信息:使用了call函数的women


  objCxy.getInfo.apply(objFlx,['使用了apply函数的men']);
   // 打印结果为:
   // 姓名: flx    年龄:100   信息:使用了apply函数的men
</script>

二 代理Proxy的使用

Proxy 这个词的原意是代理。Proxy 可以理解成拦截器(即在访问目标对象之前必须先通过这层拦截)。

Proxy常用的方法:
get 方法用于拦截某个属性的读取操作
set 方法用来拦截某个属性的赋值操作

<script>
let flxObj = {
  name: 'flx',
  age: 100,
  hobby: 'study'
}
let trueFlx = new Proxy(flxObj ,{
  get:function (target,key) {
    if (key === 'hobby') {
      // 洗脚还是学习?
      return '洗脚';
    }
    //其他的就直接返回 flxObj 自己的属性
    return target[key];
  },
  set:function (target,key,value) {
    if(key === 'hobby') {
      if (value == '我爱学习') {
         target[key] = '我不信';
      } else {
        target[key] = value;
      }
    }
  }
})

console.log(trueFlx.name)  //  flx
console.log(trueFlx.hobby)  //  洗脚


console.log(trueFlx.hobby = '我爱学习')
console.log(trueFlx) // flx  100  study   我不信
</script>

三 JS中defineProperty()用法

Object.defineProperty(Object,proName,define)
需要传入三个参数
1,object 你要操作的对象
2, proName 要添加的属性的名字
3, define 定义你添加属性的一些可操作标志 (是否可删除,是否可枚举,是否可赋值等)

<script>
let user={}
Object.defineProperty(user,'name',{
	value:'flx',
	writable:false,  // writable 是否可赋值 默认时false
	enumerable:true,  // enumerable 是否可枚举 默认是false 不可枚举
	configurable:false  // configurable 是否可删除和是否被重新定义 默认是false
})


console.log(user)  // flx

user.name='cxy'
console.log(user.name) // flx  不可修改


let key= Object.keys(user)
console.log(key)// []  不可枚举

delete user.name
console.log(user)  // flx  不可删除
</script>
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值