使用object.defineProperty来更新数据示例

news/2024/12/29 2:37:43/

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

Object.defineProperty()可以为对象的属性添加特性,每一个被添加过的属性,都会拥有属于自己的getter和setter。 正是有了getter和setter,可以实现数据驱动视图,数据实时绑定的效果

Object.defineproperty可以接收三个参数

Object.defineProperty(obj, prop, descriptor)

obj 要定义属性的对象(目标对象)
prop 要定义或修改的属性的名称
descriptor 目标对象属性的一些特征(是一个对象)
descriptor 下有6个参数
参数1:
value:属性值
参数2:
  writable:对象属性值是否可以被修改 true允许 false不允许
参数3:
  configurable:对象属性是否可以被删除 true允许 false不允许
参数4:
  enumerable:对象属性是否可被枚举
参数5:
get():给一个属性提供getter方法,当访问这个对象的属性值得时候触发该方法
参数6:
set():给一个属性提供setter方法,当设置属性值得时候触发该方法

示例效果图:

在这里插入图片描述

示例源代码

<template> <div class="container"> <h3>vue+openlayers: 利用setSource显示隐藏地图</h3> <p>文件来源:https://xiaozhuanlan.com/vue-openlayers</p> <h4> <el-button type="primary" size="mini" @click="yes">显示结果</el-button> </h4> <div id="vue-openlayers"></div> </div> 
</template> 
<script> import 'ol/ol.css'; import Map from 'ol/Map'; import View from 'ol/View'; import TileLayer from 'ol/layer/Tile'; import OSM from 'ol/source/OSM'; import {transform } from 'ol/proj' export default { name: 'show', data() { return { map: null, source: new OSM(),               } }, methods: { yes(){ let test={name:'111'} this.observe(test) test.name = 'newName' console.log(test.name,1, 'ddd') test.name = 'newName2' console.log(test.name, 2,'ddd') }, observe(data){ if (!data || typeof data !== 'object') { return; } // 取出所有属性遍历 Object.keys(data).forEach(key =>{ this.defineProp(data, key, data[key]) }) }, defineProp (data, key, childVal) { this.observe(childVal) //监听子属性 // 精华部分 Object.defineProperty(data, key, { set: (newVal) => { console.log(`哈哈哈监听到啦!原来的值是${childVal}, 变为${newVal}`) childVal = newVal; }, get: () =>{ return childVal }, enumerable: true, // 可枚举 configurable: false, // 不能再define }) }, initMap() { this.map = new Map({ layers: [ new TileLayer({ source:this.source }) ], target: 'vue-openlayers', view: new View({ center: transform([86, -37.0902],"EPSG:4326","EPSG:3857"), projection: "EPSG:3857", zoom: 2, }), }); }, }, mounted() { this.initMap(); }, } 
</script> <style scoped> .container { width: 840px; height: 570px; margin: 50px auto; border: 1px solid #42B983; } #vue-openlayers { width: 800px; height: 400px; margin: 0 auto; border: 1px solid #42B983; position: relative; } 
</style> 

http://www.ppmy.cn/news/92221.html

相关文章

Go完整即时通讯项目及Go的生态介绍

Go完整即时通讯项目 项目架构&#xff1a; 1 编写基本服务端-Server server.go package mainimport ("fmt""net" )// 定义服务端 type Server struct {ip stringport int }// 创建一个Server func NewServer(ip string, port int) *Server {return …

perl 通过 swig 调用 c++代码

Swig 是一个软件开发工具&#xff0c;可以简化不同语言与 C/C 的交互&#xff08;直接在其它语言的代码中调用 C/C 的代码&#xff09;。   记录一下成功用 perl 调用 c 代码的例子。 环境 操作系统&#xff1a;centos 7.9 perl: version 5.16.3 swig: version 2.0.10 g: v…

操作dom

1-获取元素 通过id、name、className属性获取&#xff0c;通过tagName获取&#xff1b; 通过id获取的是元素列表第一个&#xff1b;通过name属性获取的是NodeList&#xff1b;通过className和tagName获取的是HTMLCollection let son1 document.getElementById("son&quo…

C4D R26 渲染学习笔记(2):渲染流程介绍

往期文章 C4D R26 渲染学习笔记&#xff08;1&#xff09;&#xff1a;C4D版本选择和初始UI框介绍 3D建模流程 大致流程 #mermaid-svg-eE2RXHal49sVZ34l {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-eE2RXHal4…

深度学习框架-Tensorflow2:特点、架构、应用和未来发展趋势

引言 深度学习是一种新兴的技术&#xff0c;已经在许多领域中得到广泛的应用&#xff0c;如计算机视觉、自然语言处理、语音识别等。在深度学习中&#xff0c;深度学习框架扮演着重要的角色。Tensorflow是一种广泛使用的深度学习框架&#xff0c;已经成为深度学习的事实标准。…

PLX31-EIP-MBTCP 以太网/IP到Modbus TCP/IP

PLX31-EIP-MBTCP ProSoft Technology的EtherNet/IP to Modbus TCP/IP通信网关允许在支持EtherNet/IP的控制器或设备与Modbus TCP/IP控制器或设备之间进行高速双向数据传输。 我们的Modbus TCP/IP驱动程序具有多种客户端和服务器功能&#xff0c;可实现更快的数据传输。此外&a…

自动清理 ES 历史数据

一、 背景 随着业务的增长和时间的变化&#xff0c;ES 数据库的存储空间越来越大&#xff0c;存储数据多数为系统监控日志&#xff0c;保存的数据不需要长期保留&#xff0c;多数情况只需要保留几个月ES数据即可&#xff0c;既可以减轻ES服务器的负载和资源使用率&#xff0c;还…

ChatGpt都这么火了,它使用的 BPE 分词算法要不要了解一下?

Byte Pair Encoding&#xff08;BPE&#xff09;是一种文本压缩算法&#xff0c;它通常用于自然语言处理领域中的分词、词汇表构建等任务。BPE 算法的核心思想是通过不断地合并字符或子词来生成词汇表。 在这里&#xff0c;我们将对 BPE 算法进行全面、详细的讲解&#xff0c;…