20240923uniapp学习工作-vue

继续看 js proxy.

  • set(target,prop,value,receiver) : 拦截对象属性的写入操作.
<template>
	<view class="container">
		
	</view>
	<view>
		<button v-on:click="button_click">点击</button>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				eventName:"longpress‌", 
			}
		},
		methods: {
			button_click() {
				const originObj = {
					name:"lee",
					sex:"女"
				};
				
				// 定义一个用于处理属性写入的处理器对象
				let handler = {
				  set:function(target, property,value) {
					  if(property === 'name') {
						  console.log(`Setting 'name' to ${value}`);
						  target[property] = value+"拦截";
					  } else {
						  console.log(`Setting ${property} to ${value}`);
						  target[property] = value;
					  }
					  return true;
				  }
				};
				
				 
				// 创建一个代理对象
				let proxy = new Proxy(originObj, handler);
				 
				// 设置属性
				proxy.name = 'zhang';
				proxy.sex = "雄";
				 
				// 读取属性
				console.log(proxy.name); // 读取属性:name
				console.log(proxy.sex);// 读取属性: sex
			},
		}
	}
</script>

<style>
	.container {
		padding: 20px;
		font-size: 14px;
		line-height: 24px;
	}
</style>

看完这两个方法, 基本知道拦截器是怎么回事了, 还有以下这些方法

  • apply(target, thisArg, args):拦截函数的调用操作。
  • construct(target, args, newTarget):拦截new操作符的调用操作。
  • has(target, prop):拦截in操作符的调用操作。
  • deleteProperty(target, prop):拦截delete操作符的调用操作。
  • defineProperty(target, prop, descriptor):拦截Object.defineProperty()方法的调用操作。
  • getOwnPropertyDescriptor(target, prop):拦截Object.getOwnPropertyDescriptor()方法的调用操作。
  • getPrototypeOf(target):拦截Object.getPrototypeOf()方法的调用操作。
  • setPrototypeOf(target, proto):拦截Object.setPrototypeOf()方法的调用操作。
  • isExtensible(target):拦截Object.isExtensible()方法的调用操作。
  • preventExtensions(target):拦截Object.preventExtensions()方法的调用操作。
  • ownKeys(target):拦截Object.getOwnPropertyNames()、Object.getOwnPropertySymbols()、Object.keys()等方法的调用操作。

Proxy 的基本用法就是之前演示的, 使用 proxy 对象包装一下目标对象. 下面代码即如何使用 Proxy 拦截对象的读写操作:

let target = {
  name: "Alice",
  age: 20
};

let handler = {
  get: function(target, prop) {
    console.log("get " + prop);
    return target[prop];
  },
  set: function(target, prop, value) {
    console.log("set " + prop + " = " + value);
    target[prop] = value;
  }
};

let proxy = new Proxy(target, handler);

console.log(proxy.name); // get name Alice
proxy.age = 21; // set age = 21

在上面的示例代码中,我们定义了一个目标对象target,并使用Proxy对象包装它。然后,我们定义了一个handler对象,它包含了get和set方法,用于拦截对象的读写操作。在get方法中,我们输出了被读取的属性名称,并返回属性值。在set方法中,我们输出了被写入的属性名称和值,并将值写入目标对象。最后,我们使用proxy对象读取了目标对象的name属性,并将其输出到控制台。然后,我们使用proxy对象将目标对象的age属性设置为21,并将设置的过程输出到控制台。

data() 函数返回的对象的所有顶层属性都会被代理到组件实例 (即方法和生命周期钩子中的this) 上.

那这句话就明白是什么意思了.

export default {
  data() {
    return {
      count: 1
    }
  },

  // mounted 是生命周期钩子,后面会学到
  mounted() {
    // this 指向当前组件实例
    console.log(this.count) // => 1

    // 数据属性也可以被更改
    this.count = 2
  }
}

安卓开发又出奇怪的问题.搞了差点一天.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值