js的属性提示符与存储器属性

属性提示符

Property Descriptor 属性描述符
这也是直接 对象名.属性 方式给对象添加一个属性的底层方法

Object.getOwnPropertyDescriptor(对象,属性名) 或Object.getOwnPropertyDescriptors(对象)可以得到一个属性的描述符

        let obj = {
            name: "zyl",
            age: 20
        }
        console.log( Object.getOwnPropertyDescriptors(obj));

打印
在这里插入图片描述

configurable: true 该属性是否可以被修改
enumerable: true 该属性是否可以被枚举
value: “hc” 值
writable: true 该属性是否可以重新赋值

给对象添加属性(底层代码运行方式)
Object.defineProperty(对象,属性名,描述符) 添加单个属性
Object.defineProperties(对象,多个描述符)添加多个属性

        let obj = {
            name: "hc",
            age: 18
        }

        //等同于obj.password="123";
        Object.defineProperty(obj, "password", {
            configurable: true,
            enumerable: true,
            value: "123",
            writable: true
        });

        //一次性添加多个,也等同于
        //obj.password1="12345";
        //obj.password2="1234567";
        Object.defineProperties(obj, {
            password1: {
                configurable: true,
                enumerable: true,
                value: "12345",
                writable: true
            },
            password2: {
                configurable: true,
                enumerable: true,
                value: "1234567",
                writable: true
            }
        })
        console.log(Object.getOwnPropertyDescriptors(obj));

在这里插入图片描述

存储器属性

当给对象中的属性添加了get()或set()方法时则该属性不再是一个普通属性,而是变成了存储器属性。

如果一个属性是一个存储器属性的时候:

  1. 读取该属性的时候 会运行get方法
  2. 修改/赋值该属性的时候 会运行set方法
        let obj = {
        }
        Object.defineProperty(obj,"a",{
            get(){
                console.log("执行get方法");
            },
            set(){
                console.log("执行set方法")
            }
        })

在这里插入图片描述

存储器最大的意义在于 控制属性的读取和赋值。可以用于规范属性的值(如:验证账号密码是否正确等)

如下代码通过存储器将密码判断封装使用

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    密码:<input type="text" id="entry">
    <button id="login">登录</button>
    <span id="response"></span>
</body>
<script>
    let login = document.getElementById("login");
    let response = document.getElementById("response");
    let entry = document.getElementById("entry");
    let user = verification();
    login.onclick = () => {
        user.psd = entry.value;
        user.psd;
    }

    //封装登录验证
    function verification() {
        let user = {
            count: 0,//登录失败次数
        };
        // console.log(user.psd=1);
        Object.defineProperties(user, {
            psd: {
                get() {
                    return response.innerHTML = user.result;
                },
                set(val) {
                    if (val == 123456) {
                        user.result = "登录成功";
                    } else {
                        user.result = "登录失败";
                        this.count++;
                    }
                    if (this.count >= 3) {
                        user.result = "累计错误三次。请明天再来";
                    }
                }
            }
        })
        return user;
    }
</script>

</html>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
课程介绍本套课程,大喵将带着大家手把手,编辑每一行代码,使用原生Javascipt及ES6的一些新特性,仿照目前国内非常流行的Vue框架的源码,开发构建一个属于你们自己的MVVM框架。让大家能够很清晰的学习及掌握,模板编译,数据绑定,响应式,文档碎片,观察者模式,发布订阅模式等等,这些Vue的核心知识点,都是怎么回事,它们之间有哪些关联,是如何进行双向数据绑定的等等。在使用vue2.x的核心Object.defineProperty构建完成框架后,大喵也会使用Vue3.0引入的数据劫持的Proxy新特性,来改造我们的MVVM框架,提升我们的框架性能。最终,大喵会手把手带着大家,从0开始配置webpack.config.js配置文件以及引入babel-loader,配置.babelrc文件,转换我们JS文件中的的ES6语法,最终压缩输出我们的MVVM框架库文件。课程目录01 手把手搭建MVVM框架 课程介绍、02 文件结构及基础类创建、03 入口类DamiaoMvvm的实现、04 模板编译、05 元素节点解析编译、06 v-model 数据绑定逻辑梳理、07 v-model 数据绑定实现、08 模板文本编译逻辑梳理、09 模板文本渲染绑定、10 观察者Wather逻辑梳理、11 Wather 逻辑实现、12 Object.defineProperty()、13 defineProperty 小案例、14 observer数据劫持梳理、15 defineProperty数据劫持实现、16 发布订阅类实现、17 Proxy 介绍与概述、18 使用Proxy改造MVVM框架、19 使用Proxy实现响应式、20 webpack 打包配置、21 babel 配置及文件输出、22 Mvvm Proxy 框架打包、23 Mvvm 框架搭建课程总结MVVM框架介绍MVVM是 Model-View-ViewModel 的缩写。mvvm是一种设计思想。Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑;View 代表UI 组件,它负责将数据模型转化成UI 展现出来,ViewModel 是一个同步View 和 Model的对象。在MVVM架构模式下,View 和 Model 之间并没有直接的联系,而是通过ViewModel进行交互,Model 和 ViewModel 之间的交互是双向的, 因此View 数据的变化会同步到Model中,而Model 数据的变化也会立即反应到View 上。ViewModel 通过双向数据绑定把 View 层和 Model 层连接了起来,而View 和 Model 之间的同步工作完全是自动的,无需人为干涉,因此开发者只需关注业务逻辑,不需要手动操作DOM, 不需要关注数据状态的同步问题,复杂的数据状态维护完全由 MVVM 来统一管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值