首页 > 其他分享 >Object.defineProperty

Object.defineProperty

时间:2023-07-27 11:45:35浏览次数:30  
标签:set obj val firstName get Object defineProperty console

ES5提供了Object.defineProperty方法,该方法可以在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回这个对象。

语法

/* 
  参数1: 操作的对象
  参数2: 要操作或修改的对象的键
  参数3: 将被定义或修改的属性的描述符
*/
Object.defineProperty(obj, prop, descriptor)

// 栗子
Object.defineProperty(obj, 'age', {
  value: 18,  // 值, 默认为undefined
  writable: true, // 是否能被赋值运算符改变(+、+=、/等), 默认为false
  enumerable: true, // 是否能被改变, 默认为 false 
  configurable: true, // 是否能被枚举, 默认为false

  /* 
    存取描述符
    不可和 value writable 时出现
  */
  get () { }, // get 方法返回键的值, 默认为 undefined
  set (val) { } // set 方法接收新的val参数,修改键的值,默认为 undefined
});

新增属性栗子

let obj = {}
let firstName = 'JOJO'

Object.defineProperty(obj,'firstName', {
  get() {
    console.log('触发了get')
    return firstName
  },
  set(val) {
    console.log('触发了set')
    firstName = val
  }
})
obj.firstName = '鸡哥';

console.log(obj.firstName);
/* 
  打印输出: 
    触发了set // obj.firstName = '鸡哥'; 触发
    触发了get // obj.firstName; 触发
    鸡哥  // console.log(obj.firstName); 触发
*/

修改属性栗子

let obj = {
  _firstName: 'JOJO'  // 定义一个私有变量存值
};

// 新键值 避免栈溢出
Object.defineProperty(obj, 'firstName', {
  get () {
    console.log('get');
    return this._firstName;
  },
  set (val) {
    console.log('set');
    this._firstName = val;
  }
});

obj.firstName = '鸡哥';

console.log(obj.firstName);
/* 
  打印输出:
    set
    get
    鸡哥
*/

深度侦听对象、侦听数组

const obj = {
  firstName: 'JOJO',
  age: 18,
  children: {
    obj2: {
      firstName: '鸡哥'
    },
    obj3: {
      firstName: '坤坤'
    }
  },
  hobby: ['吃饭', '睡觉'],
};

function ob (params) {
  if (typeof params != 'object') return;
  for (const key in params) {
    f(params, key, params[key]);
  }
}

function f (obj, key, value) {
  // 多层嵌套对象
  ob(value);
  Object.defineProperty(obj, key, {
    get () {
      console.log('get', key, value);
      return value;
    },
    set (val) {
      // 避免修改的值是一个对象
      ob(val);
      console.log('set', key, val);
      value = val;
    }
  });
}

ob(obj);

obj.children.obj2.firstName = '被修改了'  
/* 
  分别输出: 逐级遍历
    get children {...}
    get obj2 {...}
    set firstName 被修改了 
*/

obj.hobby[0] = '被修改了'
/* 
  分别输出:根据数组索引修改元素能被监测到
  get hobby [...]
  get 0 吃法
  get 1 睡觉
  set 0 被修改了
*/

obj.hobby.push('新增的')
/* 
  分别输出: 使用方法监测不到 vue 重写了数组部分方法
  get hobby [...]
  get 0 吃法
  get 1 睡觉
*/

监控数据栗子 类似 watch

function Archiver () {
  let val = null;
  // 新旧值
  let archiver = [];

  Object.defineProperty(this, 'firstName', {
    get () {
      console.log('get');
      return val;
    },
    set (value) {
      console.log('set');
      val = value;
      archiver.unshift({ '值': value });
    }
  });

  this.getArchiver = () => archiver;
}

// 构造函数
const obj = new Archiver();

obj.firstName = 'JOJO';

obj.firstName = '鸡哥';

console.log(obj.getArchiver());
/* 
  打印输出: 
    set
    set
    [ { '值': '鸡哥' }, { '值': 'JOJO' } ]
*/

标签:set,obj,val,firstName,get,Object,defineProperty,console
From: https://www.cnblogs.com/chennr/p/17584556.html

相关文章

  • 使用filesystemobject获取文件夹及子文件夹下所有文件名
    1OptionExplicit2Dimi3Functionsda(path)4Dimfso5Dimf6Dims7Dimff8Setfso=CreateObject("scripting.filesystemobject")9Setf=fso.getfolder(path)10ForEachsInf.Files11i=i......
  • Using PL/SQL Object Types for JSON
    #https://docs.oracle.com/en/database/oracle/oracle-database/12.2/adjsn/using-PLSQL-object-types-for-JSON.html#GUID-F0561593-D0B9-44EA-9C8C-ACB6AA9474EEDECLAREjeJSON_ELEMENT_T;joJSON_OBJECT_T;BEGINje:=JSON_ELEMENT_T.parse('{"name......
  • python如何将object转换为数值
    项目方案:将图像转换为数值的应用1.项目背景和介绍在现代科技领域中,图像处理和分析是一个非常重要的领域。图像数据通常以像素的形式呈现,而如何将这些像素转换为数值数据是实现图像处理和分析的关键步骤之一。Python是一种功能强大的编程语言,具有丰富的库和工具,可以帮助我们将图......
  • shared pool之三:library cache结构/library cache object的结构-dump LibraryHandle
    Librarycache结构Librarycache最主要的功能就是存放用户提交的SQL语句,SQL语句相关的解析树(解析树也就是对SQL语句中所涉及到的所有对象的展现)--->共享SQL区(sharedSQLareas),私有SQL区(privateSQLareas,如果配置了共享服务器),执行计划,用户提交的PL/SQL程序块(包括匿名程序块,存......
  • 泛型和Object的区别
    什么时候使用泛型:只要确定了用哪类对象,并且用到这个对象里的方法。选择泛型,泛型更加精确,只要用到Object的地方基本都能用泛型代替。Object类:Object是所有类的父类,更加笼统,且只能使用固定的属性。例:将List<Object>aa转化List<QueryBO>bb。@DatapublicclassQueryBO{......
  • android textView gettag java.lang.String java.lang.Object.toString()
    AndroidTextView.getTag()方法详解在Android开发中,TextView是最常用的UI控件之一,用于显示文本内容。除了显示文本之外,TextView还提供了一些其他的方法,其中之一就是getTag()方法。本文将介绍这个方法的使用和作用。什么是getTag()方法getTag()方法是TextView类的一个方法,它用于......
  • Python报错 | AttributeError: 'NoneType' object has no attribute 'group'
    报错信息使用Python正则匹配的时候,报如下错误:AttributeError:'NoneType'objecthasnoattribute'group'错误原因报错翻译过来是:属性错误:“NoneType”对象没有属性“group”没有匹配到符合正则表达式的内容,但又调用了group方法。importrestr='hellopython!!!hel......
  • java parseObject修改
    JavaparseObject修改在Java编程中,我们经常需要将字符串转换为对象,或者将对象转换为字符串。这种转换的过程被称为"解析"。Java中提供了多种方式来实现解析,其中之一就是使用parseObject方法。parseObject方法的作用parseObject方法是Java中的一个静态方法,它被定义在java.text.F......
  • objects的使用
    在Django中,objects是每个模型类的默认管理器(Manager)。管理器提供了用于查询数据库的接口,包括创建、检索、更新和删除数据等常见操作。objects是Django自动为每个模型类提供的默认管理器,它是一个django.db.models.Manager类的实例。默认情况下,当你在Django中定义一个模型类......
  • bcftools: error while loading shared libraries: libcrypto.so.1.0.0: cannot open
     001、问题[root@PC1home]#bcftoolsbcftools:errorwhileloadingsharedlibraries:libcrypto.so.1.0.0:cannotopensharedobjectfile:Nosuchfileordirectory 002、解决方法[root@PC1home]#find/-userroot-name"libcrypto.so.*"##查找库文......