vue2数据响应式原理(2)搭建webpack认识一下Object.defineProperty

news2024/9/20 1:18:17

在1中我们讲到 Object.defineProperty() 是vue2实现数据响应的关键 那么我们就来好好的看看这个方法

方法字面意思是定义属性 而他是通过Object对象调用的 所以说 他是用来控制对象的某个属性的
比较官方的解释是

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

然后呢 我们就要开始写代码了 我们需要先创建一个webpack的项目环境
我们选择一个目录来放自己的项目 然后执行

npm init

然后 目录下就会出来一个package.json

然后 我们需要引入比较多的依赖 在终端执行

npm install webpack webpack-cli html-webpack-plugin webpack-dev-server --save-dev

装好之后 目录就成了这样
在这里插入图片描述
我们在根目录下创建一个src下文件夹
然后 在这个新的src目录下创建一个文件 叫 index.html
参考代码如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div id = "text"></div>
</body>
</html>

然后我们在src下创建一个文件叫output.js 参考代码如下

const output = () => {
    console.log("output成功执行");
    document.getElementById("text").innerHTML = "output成功执行";
}

export default output

然后在src下创建文件 index.js
参考代码如下

import output from "./output"

window.onload = function() {
    output();
}

然后 我们在项目根目录下创建文件 webpack.config.js 参考代码如下

//通过node获取到当前文件的位置
const path = require('path')
//导入刚引入的第三方插件html-webpack-plugin
const HtmlWebpackPplugin = require('html-webpack-plugin')
module.exports = {
    //设置当前入口文件
    entry: './src/index.js',
    //出口配置
    output: {
      //打包的文件名
      filename: 'bundle.js',
      //生成的文件位置
      path: path.resolve(__dirname, './distribution')
      //设置自动清理掉原本的打包文件
      //clean: true
    },
    mode: 'none',
    //webpack插件配置
    plugins: [
      //实例化html-webpack-plugin插件功能
      new HtmlWebpackPplugin({
        //html-webpack-plugin参数配置
        //指定打包HTML文件参照的模板HTML
        template: './src/index.html',
        //生成的html文件名称
        filename: 'app.html',
        //定义打包的js文件引入在新html的哪个标签里
        inject: 'head'
      })
    ],
    //设置webpack-dev-server监听属性
    devServer: {
      //设置webpack-dev-server监听路径
      static: './distribution'
    }
}

然后找到 package.json 下找到scripts

"build": "webpack-dev-server",
"webpack": "webpack"

在这里插入图片描述
然后执行

npm run webpack

打一下包

然后执行

npm run build

项目就跑起来了
在这里插入图片描述
然后 我们往上翻
找到运行的端口
在这里插入图片描述
然后 用浏览器访问
在这里插入图片描述
点HTML进去
在这里插入图片描述

然后 我们将output.js 编写代码如下

var obj = {};

Object.defineProperty(obj,'a',{
    value: 3
});

Object.defineProperty(obj,'b',{
    value: 5
});

console.log(obj);
const output = () => {
    console.log("output成功执行");
    document.getElementById("text").innerHTML = obj.a+"    "+obj.b;
}

export default output

然后我们直接打开浏览器观看
在这里插入图片描述
简单说 我们定义了一个变量 obj 他的初始值是一个空对象
然后通过defineProperty给他定义了两个键 a 值为 3 然后 b值为 5 我们界面也顺利的输出了如下内容

这就是Object.defineProperty给某个对象定义一个字段和值
这样我们大概就知道了 他的第一个参数 是 你要给那个对象加 第二个参数是你加的字段要叫什么 第三个 是一个对象 {value: 初始值}

这时候 大家就会想 我直接 obj.a = 3; obj.b = 5; 不比这看着方便多了吗?
没错
但Object.defineProperty可以设置一些隐藏的属性
例如 writable 控制对象该字段是否能够修改

Object.defineProperty(obj,'a',{
    value: 3,
    writable: false
});

此时 a 字段就成立一个不能修改的字段 他的值定义开始 将不再能被修改
我们将output.js代码更改如下

var obj = {};

Object.defineProperty(obj,'a',{
    value: 3,
    writable: true
});

Object.defineProperty(obj,'b',{
    value: 5
});

obj.a = 5;
const output = () => {
    console.log("output成功执行");
    document.getElementById("text").innerHTML = obj.a+"    "+obj.b;
}

export default output

打开浏览器访问项目
可以看到 writable为true时 我们下面obj.a = 5;成功将a改成了5
在这里插入图片描述
然后 我们将
Object.defineProperty(obj,‘a’,{
value: 3,
writable: true
});
的true改成 false
他就直接报错了 因为 这是个不能修改的属性
在这里插入图片描述
还有 enumerable 属性 我们将output.js代码更改如下

var obj = {};

Object.defineProperty(obj,'a',{
    value: 3,
    enumerable: true
});

Object.defineProperty(obj,'b',{
    value: 5,
    enumerable: false
});

Object.defineProperty(obj,'C',{
    value: 7,
    enumerable: false
});

Object.defineProperty(obj,'d',{
    value: 8,
    enumerable: true
});

for(let key in obj){
    console.log(key);
}
const output = () => {
    console.log("output成功执行");
    document.getElementById("text").innerHTML = obj.a+"    "+obj.b;
}

export default output

可以看到 我们for去遍历对象中的键 但 只有 a 和 d参与了遍历
这也正好 a 和 d enumerable设为了true
在这里插入图片描述
然后 下面我们就要看一个相对重点的东西了 Object.defineProperty的get和set

output.js代码更改如下

var obj = {
    a: 11
};

Object.defineProperty(obj,'a',{
    get() {
        console.log("您正在试图访问 obj的a属性");
    }
});

const output = () => {
    document.getElementById("text").innerHTML = obj.a;
}

export default output

运行项目
在这里插入图片描述
可以看到 用 Object.defineProperty 给a字段设置的get是触发了 因为我们在innerHTML渲染dom节点时 获取了他的值 get用于监听有地方要获取他的值 就会触发

那么 举一反三 大家应该都猜到set的作用了
我们更改output.js代码更改如下

var obj = {
    a: 11
};

Object.defineProperty(obj,'a',{
    get() {
        
    },
    set() {
        console.log("您正在试图改变 obj的a属性");
    }
});

obj.a = 12;

const output = () => {
    document.getElementById("text").innerHTML = obj.a;
}

export default output

运行结果如下
在这里插入图片描述
当我们去修改a的值时 这个set方法 他就触发了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/432616.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单片机添加版本号的一些小技巧

平时我们写程序&#xff0c;通常都会备注软件版本&#xff0c;那么&#xff0c;怎么在单片机中保存版本信息呢&#xff1f; 方法其实有很多&#xff0c;但基本原理都是在指定存储区域&#xff08;Flash&#xff09;中写入软件版本信息。 实现方法 下面就分享一个最常用&#xf…

算法风险防控

算法风险防控是指在算法应用过程中&#xff0c;通过对算法应用场景、数据、模型和结果等多个方面的风险进行评估和控制&#xff0c;以保障算法应用的安全性、可靠性和合法性。以下是一些常见的算法风险防控措施&#xff1a; 数据风险防控&#xff1a;在算法应用中&#xff0c;…

【python】Python基础入门:从变量到异常处理

天池实验室代码链接&#xff1a;https://tianchi.aliyun.com/notebook-ai/home#notebookLabId491001 简介 Python 是一种通用编程语言&#xff0c;其在科学计算和机器学习领域具有广泛的应用。如果我们打算利用 Python 来执行机器学习&#xff0c;那么对 Python 有一些基本的了…

51单片机定时器与计数器

文章目录 51单片机定时器与计数器一、定时器与计数器的结构与功能计数功能定时功能 二、定时器与计数器的控制TMOD 工作方式寄存器TCON 定时器控制寄存器 三、仿真案例(一).8个LED 1 秒周期闪烁。(二) 产品包装生产线。 51单片机定时器与计数器 一、定时器与计数器的结构与功能…

ESP32设备驱动-BMP388气压传感器驱动

BMP388气压传感器驱动 文章目录 BMP388气压传感器驱动1、BMP388介绍2、硬件准备3、软件准备4、驱动实现1、BMP388介绍 BMP388 是一款非常小巧、低功耗和低噪声的 24 位绝对气压传感器。 它可以实现精确的高度跟踪,特别适合无人机应用。 BMP388 在 0-65C 之间的同类最佳 TCO,…

港联证券|AI概念板块无死角杀跌,主题炒作熄火后资金会流向哪些板块?

ChatGPT概念指数大跌7%&#xff0c;单日跌幅创历史之最。 4月10日&#xff0c;炒作逾月的ChatGPT概念板块团体大跌&#xff0c;云从科技&#xff08;688327.SH&#xff09;、三六零&#xff08;601360.SH&#xff09;、科大讯飞&#xff08;002230.SZ&#xff09;等热门股跌停&…

集中式版本控制工具 —— SVN

一、简介 1️⃣ SVN 是什么&#xff1f; 代码版本管理工具他能记住每次的修改查看所有的修改记录恢复到任何历史版本恢复已经删除的文件 2️⃣ SVN 与 Git 相比有什么优势&#xff1f; 使用简单、上手快目录级权限控制&#xff0c;企业安全必备子目录 Checkout&#xff0c;…

RK3568平台开发系列讲解(Linux系统篇)文件系统的读写

🚀返回专栏总目录 文章目录 一、文件IO1.1、文件 IO read()1.2、文件 IO write()二、系统调用层和虚拟文件系统层三、ext4 文件系统层沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们一起学习 read 和 write 调用过程。 一、文件IO 1.1、文件 IO read() rea…

openLdap2.4.44的安装部署

openLdap2.4.44的安装部署 一、安装 1.从yum源拉取 yum install -y openldap openldap-clients openldap-servers 2.复制DB到指定目录 cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG 3.给目录授权 &#xff08;如果没有ldap &#xff0c;可…

定时任务框架快速入门

一、Quartz 1. Quartz 概述 Quartz 是一个开源的作业调度框架(job scheduler)&#xff0c;几乎可以集成到任何 Java 应用程序中&#xff0c;从最小的独立应用程序到最大的电子商务系统。Quartz 可用于创建简单或复杂的调度来执行数十个、数百个甚至数万个作业&#xff1b;其任务…

[NOIP1999 普及组] Cantor 表

[NOIP1999 普及组] Cantor 表 题目描述: 现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的&#xff1a; 1/1 , 1/2 , 1/3 , 1/4, 1/5, … 2/1, 2/2 , 2/3, 2/4, … 3/1 , 3/2, 3/3, … 4…

win11下载配置Python环境+pycharm下载

前两天快乐的把我重装的win10升级成win11&#xff0c;升级的时候超怕不能成功&#xff0c;但效果还不错&#xff0c;然后突然想学一学Python&#xff0c;所以首先来配置环境吧 一、下载安装包 建议去官网&#xff0c;因为自从有了Python3之后&#xff0c;Python2就慢慢的被淘汰…

测试市场已经饱和了吗?现在转行软件测试会不会太迟?

非常有意思的话题&#xff0c;某种程度上来说&#xff0c;测试职场一条从未设想过的道路真的走通了。 这条路指广大测试呼吁对测试从业进行学历保护、专业保护&#xff0c;就像医学那样设置护城河&#xff0c;以一种令人意想不到的方式完成了。 得益于大量培训机构为了赚钱&a…

R语言地理加权回归、主成份分析、判别分析等空间异质性数据分析

在自然和社会科学领域有大量与地理或空间有关的数据&#xff0c;这一类数据一般具有严重的空间异质性&#xff0c;而通常的统计学方法并不能处理空间异质性&#xff0c;因而对此类型的数据无能为力。以地理加权回归为基础的一系列方法&#xff1a;经典地理加权回归&#xff0c;…

有趣的Hack-A-Sat黑掉卫星挑战赛——被破坏的阿波罗计算机(解法二)

国家太空安全是国家安全在空间领域的表现。随着太空技术在政治、经济、军事、文化等各个领域的应用不断增加&#xff0c;太空已经成为国家赖以生存与发展的命脉之一&#xff0c;凝聚着巨大的国家利益&#xff0c;太空安全的重要性日益凸显[1]。而在信息化时代&#xff0c;太空安…

全网最火爆,Web自动化测试POM模式分层实战,框架封装看这一篇就够了

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 线性脚本以快递 100…

【可信平台】SO202303191426,销售订单未同步,销售出库单未同步

1.销售订单未同步 这里先说下推送逻辑:1.物料描述带有‘再生’ 。2.公司是芮邦 这个物料应该在EOS里查,可我不会,我在MES里查,的确符合条件。 可信平台同步逻辑,是销售订单同步了,才会同步销售出库单。 这个SO销售订单就没同步,要先解决这个问题。 可以在接口看日志…

HighTec编译器错误记录

目录 1、HighTec安装后缺少Universal Debug Engine 2、HighTec工程改名后不能跳转函数定义&#xff0c;提示找不到定义。 3、HighTec工程重复编译 1、HighTec安装后缺少Universal Debug Engine 在HighTec安装后&#xff0c;没有调试UDE&#xff0c;重装系统后还是没有&#x…

STM32F4_OLED显示

目录 1. OLED简介 2. 硬件模块 3. 8080并行接口 4. SPI方式 5. SSD1306常用命令表 6. 完整源码 (STM32F407对应的源码) 6.1 oled.c 6.2 oled.h 6.3 oledfont.h 7. IIC接口下的OLED(STM32F407搭配4Pin OLED) 7.1 OLED.c 7.2 OLED.h 7.3 OLED_Font.h 7.4 MyI2C.c …

QTableview 隐藏单元格内控件无效的原因

QTableview 隐藏单元格内控件无效的原因 背景&#xff1a; 在QTableview的单元格中创建多个QComboBox&#xff0c;当某条件成立时&#xff0c;隐藏特定单元格中的QComboBox&#xff0c;使得该单元格为空。 DEMO&#xff1a; #ifndef MAINWINDOW_H #define MAINWINDOW_H#inc…