在对象中,set 和 get 是属性的特性,用于定义属性的赋值和取值行为。它们允许您在属性被赋值或取值时执行自定义的逻辑。
set 是一个对象属性的特性,用于定义属性的赋值行为。当给属性赋值时,set 方法会被调用,允许执行自定义的逻辑。
let obj = {
name:0,
set changename(value){
if (value >5) {
this.name =value;
}
}
}
obj.changename=10 //10
obj.changename=4 //0
console.log(obj.name);
通过changename函数 在里面进行需要的条件判断来修改name值,给这个函数赋值的时候,就会触发这个set。 注意 函数名跟属性名不能一样,不然就要递归调用报栈溢出错误了,
get 用于定义对象属性的获取行为。当访问对象的属性时,get 方法会被触发,并且可以在方法中执行相应的逻辑。
let obj = {
name:0,
set changename(value){
if (value >5) {
this.name =value;
}
},
get changename(){
return this.name =1
},
}
obj.changename=10 //10
obj.changename=4 //0
console.log(obj.changename); //1 (获取的时候会触发get)
假设 我们要访问一个属性,然后不管设置还有获取都需要对这个属性进行相应操作 ,我们就可以使用 很好的搭配使用set和get。 其实就相当于你针对一个属性写了两个不同的函数进行操作,只不过 set get 我们写的函数名称一样,便于易读浏览。
Proxy 是 JavaScript 提供的一个内置对象,用于创建一个代理对象,可以拦截并自定义对目标对象的操作。通过使用 Proxy,我们可以对目标对象的属性访问、赋值、删除等操作进行拦截和处理。
let obj = {
name: 0,
};
let handle = {
set: function (target, name, value) {
if (value > 5) {
target[name] = value;
}
},
get: function (target, name) {
return (target[name] = 1);
},
};
let proxy = new Proxy(obj, handle);
proxy.changename = 10; //10
proxy.changename = 4; //0
console.log(proxy.changename); //1
通过proxy代理来访问 对象进行获取和赋值等操作。
区别就跟名字一样,对象属性拦截,是你在对象中给某个属性设置拦截操作,当它获取,和赋值的时候触发,对象拦截 是设置proxy代理,通过代理来访问,既然通过代理来访问对象属性,则任何操作,只要你对这个对象有操作,都会进行拦截判断, 也就是说 一个是针对对象里的一个属性,一个是针对整个对象。
let obj = {
name: 0,
set changename(value) {
if (value > 5) {
this.name = value;
}
},
get changename() {
return (this.name += 1);
},
};
let handle = {
//target原对象,name是属性
get: function (target, name) {
target[name] += 1;
//注意 get 一定要return
return target[name];
},
//value传的值
set: function (target, name, value) {
if (typeof value == "number") {
target[name] = value;
}
},
};
let proxy = new Proxy(obj, handle);
proxy.changename = 10;
proxy.changename = "4";
console.log(proxy.changename);
写了个题目 供大家练习,感觉有面试题那味儿了,大家看看自己得出的结果是多少。
揭晓答案: 13。 讲解:proxy.changename = 10; 走proxy里的set, set里进行判断是一个数值,然后调用obj对象进行赋值,赋值的时候会触发obj的set拦截,判断大于5,ok最后赋值成10. 第二次 赋值字符串4 set判断 不通过就没下文了,默认return 一个undefined。 然后就是最后的显示了,显示的时候会触发proxy里的get 然后执行这段代码
target[name] += 1;
也就是
target[name] =target[name] +1;
target[name] +1里的target[name] ,就相当于get操作触发obj里的get,于是就会加一,10+1变成了11,然后是11加1。也就是十二。 然后return target[name]; 又试一次get 操作 就是12 +1 结果就变成了 13。
Reflect 是一个内置的 JavaScript 对象,它提供了一组用于操作对象的方法。这些方法与对象的操作行为相对应,例如属性访问、函数调用、实例化等。 通俗来讲,我们可以使用这个对象,来进行日常的对象操作,比如取值,赋值等等一些操作,他同样可以完成并且有一些其他的优点,我们使用reflect一般都是搭配proxy使用。
比如像下面这样。
const obj = {
foo: 42,
};
const value = Reflect.get(obj, 'foo');
console.log(value); // 输出: 42
把它应用到我们上面的题。
let obj = {
name: 0,
set changename(value) {
if (value > 5) {
this.name = value;
}
},
get changename() {
return (this.name += 1);
},
};
let handle = {
//target原对象,name是属性
get: function (target, name) {
target[name] += 1;
//注意 get 一定要return
return Reflect.get(target, name);
},
//value传的值
set: function (target, name, value) {
if (typeof value == "number") {
Reflect.set(target, name, value)
}
},
};
let proxy = new Proxy(obj, handle);
proxy.changename = 10;
proxy.changename = "4";
console.log(proxy.changename);
···