坑1

let obj={};
let o = Object.defineProperty(obj,'key',{configurable: true,enumerable: true,get: function () {return this.key || 0;},set: function (n) {obj.key = n;}
})
console.log(o.key);
//报Uncaught RangeError: Maximum call stack size exceeded

以上代码会报 Uncaught RangeError: Maximum call stack size exceeded
原因在于,get函数中,return this.key会再一次触发get函数导致死循环
坑2

let obj={};
let val='';
let o = Object.defineProperty(obj,'key',{configurable: true,enumerable: true,get: function () {return val || 0;},set: function (n) {val = n;}
})
console.log(o.key);
//返回0
val=2;
console.log(o.key);
//返回2

以上代码,虽然成功的实现了Object.defineProperty但是,o.val会受外部变量val的影响
坑3

let obj={};
let o = Object.defineProperty(obj,'key',{configurable: true,enumerable: true,get: function () {return this.val || 0;},set: function (n) {this.val= n;}
})
console.log(o.key);
//返回0
obj.val=2;
console.log(o.key);
//返回2

以上代码,虽然成功的实现了Object.defineProperty但是,o.val会受obj.val的影响

最后解决方案,利用闭包返回一个新的对象,

function getObj(){let obj={};
let val=''; //此处val是安全的,外部是无法修改的
let o = Object.defineProperty(obj,'key',{configurable: true,enumerable: true,get: function () {return val || 0;},set: function (n) {val = n;}
})
return o; //每个对象都是新的
}
let aa = getObj();
console.log(aa.key); //返回0

总结一下Object.defineProperty使用时,如果需要设置get,set,那么要包一层函数,最后返回的是生成的object,把get,set操作的值放在函数内部,防止外部污染

关于Object.defineProperty的几个坑相关推荐

  1. IE浏览器兼容Object.assign踩过的坑

    IE浏览器兼容Object.assign踩过的坑 1.背景: 使用Object.assign,又在IE浏览器上访问时,会报该方法不存在~ ERROR:对象不支持"assign"属性 ...

  2. Object.defineProperty()

    let obj = {}; let song = '发如雪'; obj.singer = '周杰伦'; Object.defineProperty(obj, 'music', { // 1. valu ...

  3. Vue、angular等框架实现双向绑定的原理,核心机制是使用了Object.defineProperty

    <div id="name"></div> var obj = {};Object.defineProperty(obj, "name" ...

  4. 对javscript中Object.defineProperty的理解

      自己在使用vue的过程中经常会用到听到数据双向绑定这个词,而且我们还可以直接通过调用this.msg(this表示vue实例),来获取data上的数据,以前一直不太明白为什么可以这样获取,直到有一 ...

  5. vue 数据绑定实现的核心 Object.defineProperty()

    vue深入响应式原理 现在是时候深入一下了!Vue 最独特的特性之一,是其非侵入性的响应式系统.数据模型仅仅是普通的 JavaScript 对象.而当你修改它们时,视图会进行更新.这使得状态管理非常简 ...

  6. Object.defineProperty的理解

    一.Object.defineProperty:给一个对象定义一个新的属性或修改一个对象现有的属性,并且返回这个对象 1.语法:Object.defineProperty(参数1,参数2,参数3) 参 ...

  7. vue中实现双向数据绑定原理,使用了Object.defineproperty()方法,方法简单

    在vue中双向数据绑定原理,我们一般都是用v-model来实现的 ,但一般在面试话会问到其实现的原理, 方法比较简单,就是利用了es5中的一个方法.Object.defineproperty(),它有 ...

  8. Object.defineProperty()方法的用法详解

    Object.defineProperty()函数是给对象设置属性的. Object.defineProperty(object, propertyname, descriptor); 一共有三个参数 ...

  9. Object.defineProperty与双向绑定、数据监听

    一.对象赋值的两种方式 一是"="赋值,一是Object.defineProperty方法,而当下流行框架中广泛应用的双向绑定和数据监听等,就是利用的第二种方式,关于此方法不多讲, ...

最新文章

  1. 华为机考HJ17坐标移动
  2. 【alibaba-cloud】Gateway网关
  3. python数字类型-Python基础:数据类型-数字(5)
  4. 小程序promise封装post请求_微信小程序 es6-promise.js封装请求与处理异步进程
  5. 结合电商支付业务一文搞懂DDD
  6. 编写junit 测试_使用JUnit和Repeat注​​释编写有效的负载测试
  7. DevExpress.Utils.ToolTipLocation
  8. 判断元素是否存在(信息学奥赛一本通-T1211)
  9. django的调试模式 功能与开关
  10. Linux-可重入函数(day10)
  11. Auto CAD:CAD软件之上菜单栏(CAD选项设置、常用工具(样条曲线/多段线/倒角/移动/镜像/偏移/修剪工具/延伸/阵列)、修改工具(拉长/编辑多段线/对齐命令、注释/标注)简介之详细攻略
  12. Ubuntu安装显卡驱动详细步骤
  13. Python 3——xlsxwriter生成图表
  14. 2022年11月网络工程师考试知识点分布
  15. 设置计算机系统语言,windows系统默认语言如何设置-windows系统默认语言设置方法 - 河东软件园...
  16. Linux Regulator Framework(2) - regulator driver
  17. 期刊论文发表的格式要求是什么
  18. 3.9、互斥锁(互斥量)
  19. vue buid打包,修改环境变量
  20. 案例分享——智能手表(全套解决方案:生理监测、久坐提醒、来电提醒、OTA、无线通信、语音播报、长时间待机等)

热门文章

  1. 6-2 从shape类派生出一个正n边形 (10 分)
  2. 基于四信工业路由器的连锁超市收银解决方案
  3. 金蝶云星空与聚水潭系统对接方案(金蝶主管库存)
  4. 回归预测 | MATLAB实现Bayes-LSTM(贝叶斯优化长短期记忆神经网络)多输入单输出
  5. 使用NPOI的方法导入Excel表格
  6. Web 证书和IE浏览器的关系
  7. C语言stu1成员age的非法引用,2009年上海市高校计算机等级考试(2级C-b卷)
  8. 关于java实现简单的售货机程序
  9. JavaScript高手之路:构造函数方式封装对象
  10. Git - 常用命令