JavaScript必备知识点之Object.defineProperty与es6Proxy代理二三事(一)

乍一看proxy就想到了 Nginx 里面的代理。不过今天要分享的不是 Nginx 里的代理,而是 ES6 新增的类Proxy

代理一词早在 JavaScript 事件委托中有出现(利用事件冒泡向父级添加事件作用于子级)。就是说我不直接操作要作用的对象而是通过“中介”来操作。
事件代理

document.addEventListener("click", function(e) {
   
  // e.target   do something...
});
认识 defineProperty

在 ES6 还没有增加 proxy 特性时,我们可以使用defineProperty来劫持数据达到代理的效果。
Object.defineProperty(obj, prop, descriptor)

参数分别为 obj:要在其上定义属性的对象、prop:要定义或修改的属性的名称、
descriptor:将被定义或修改的属性描述符。返回传递给函数的对象。

descriptor描述符又分为数据描述符和存取描述符。数据描述符是一个具有值的属性,该值可能是可写的,也可能不是可写的。存取描述符是由 getter-setter 函数对描述的属性。
数据描述符和存取描述符同时具有的可选键值
configurable:configurable 为 true 时,该属性描述符才能够被改变,同时该属性也能从对应的对象上被删除。默认为 false。
enumerable:enumerable 为 true 时,该属性才能够出现在对象的枚举属性中。默认为 false。
数据描述符具有的可选键值
value:该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为 undefined。
writable:当且仅当该属性的 writable 为 true 时,value 才能被赋值运算符改变。默认为 false。

存取描述符具有的可选键值
get:一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。当访问该属性时,该方法会被执行,方法执行时没有参数传入,但是会传入 this 对象(由于继承关系,这里的 this 并不一定是定义该属性的对象)。默认为 undefined。
set:一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。当属性值修改时,触发执行该方法。该方法将接受一个参数,即该属性新的参数值。
默认为 undefined。

var data = {
   
  name: "lisi"
};
Object.defineProperty(data, "name", {
   
  get: function() {
   
    console.log("get");
  },
  set: function() {
   
    console.log("咦~有变化");
  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值