学习VUE总得知道Object.defineProxy怎么使用吧

举报
伯约同学 发表于 2022/02/14 23:18:02 2022/02/14
【摘要】 学习VUE总得知道Object.defineProxy怎么使用吧工作归工作,不要觉得会用就完事了,很多时候得多看看基础。今天就专门讲一下Object.defineProxy是如何使用的,这样在以后讲到Vue2.X的源码时,就更容易理解了。Object.defineProperty()方法可以直接在一个对象上定义一个新属性或者修改它的一个先有属性并返回此对象。下面先举个例子示意下。const ...

学习VUE总得知道Object.defineProxy怎么使用吧

工作归工作,不要觉得会用就完事了,很多时候得多看看基础。今天就专门讲一下Object.defineProxy是如何使用的,这样在以后讲到Vue2.X的源码时,就更容易理解了。

Object.defineProperty()方法可以直接在一个对象上定义一个新属性或者修改它的一个先有属性并返回此对象。

下面先举个例子示意下。

const obj = {};
const obj2 = Object.defineProperty(obj, 'property', {
  value: 42,
  writable: false
});
obj.property = 77;
console.log(obj); // {property: 42}
obj2.test = 3
obj2.property = 78;
console.log(obj) // {test: 3, property: 42}
obj.test = 5
console.log(obj2) //{test: 5, property: 42}

可以看出入参有三个,出参就是原对象(修改后的)

Object.defineProperty(obj, prop, descriptor)

入参中第一个参数,就是要修改的对象,第二个参数是要定义或修改的属性,第三个参数是对应的属性描述符号。前两个比较好理解,重点在于第三个参数。

属性描述符分为两类,一种是数据描述符一种是存取描述符。

数据描述符包含的属性有:configurable、enumerable、value、writable

存取描述符包含的属性有:configurable、enumerable、get、set

一个描述符不可能同时存在 valuewritablegetset

示例:

const obj = {};
const obj2 = Object.defineProperty(obj, 'property', {
 writable: false,
 get() {
  return 1
 }
});
console.log(obj2)

此时浏览器会报错:Invalid property descriptor. Cannot both specify accessors and a value or writable attribute

属性介绍:

  • configurable

    当且仅当该属性的 configurable 键值为 true 时,该属性的描述符才能够被改变,同时该属性也能从对应的对象上被删除。 默认为 false

  • enumerable

    当且仅当该属性的 enumerable 键值为 true 时,该属性才会出现在对象的枚举属性中。 默认为 false

  • value

    该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。 默认为 undefined

  • writable

    当且仅当该属性的 writable 键值为 true 时,属性的值,也就是上面的 value,才能被赋值运算符 (en-US)改变。 **默认为 false

  • get 相比直接使用value可以多一些运算在里面 默认值undefined

  • set 相比直接赋值可以多一些函数进行处理 默认值undefined


几个简单示例:

const obj = {};
  const obj2 = Object.defineProperty(obj, 'property', {
   writable: false,
   value: 22
  });
  delete obj2.property
  console.log(obj2)
  //你会发现无法删除该属性
const obj = {};
  const obj2 = Object.defineProperty(obj, 'property', {
   get() {
•    return property
   },
   set(val) {
•    property = val + 1
   }/
   
  });
  obj2.property = 2
  console.log(obj2.property) 
  // 显示3 

这里值得注意的是set和get函数中的属性是如何设置或返回的。

简单用法就是这些,下一篇讲讲VUE是如何把它活用起来的。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。