JavaScript高级(七)--对象【包含vue2响应式原理】

news/2024/7/19 15:08:19 标签: javascript, 开发语言, ecmascript, 前端, js高级, js

 对象

对象是JavaScript中一个非常重要的概念,这是因为对象可以将多个相关联的数据封装到一起,更好的描述一个事物,JavaScript其实支持多种编程范式的,包括函数式编程面向对象编程

创建对象的方式
  • 早期使用创建对象的方式最多的是使用Object类,并且使用new关键字来创建一个对象。
javascript">    var person = new Object();
    person.name = "malong";
    person.age = 22
    person.study = function() {
        console.log(this.name)
    }
  • 后来很多开发者为了方便起见,都是直接通过字面量的形式来创建对象,这种方式看起来更简洁内聚性也更强。
    javascript">    var person1 = {
            name: "malong",
            age: 22,
            study: function() {
                console.log(this.name)
            }
        }
    
    对象属性操作的控制
    对象属性获取
  •     var obj = {
            name: "zhangsan",
            age: 18
        }
        console.log(obj.name)
对象属性修改

    var obj = {
        name: "zhangsan",
        age: 18
    }
    
    obj.name = "malong"


对象属性删除

    var obj = {
        name: "zhangsan",
        age: 18
    }
    delete obj.age
    console.log(obj)


对象遍历

    Object.prototype.gender = "男"
    var obj = {
        name: "zhangsan",
        age: 18
    }
    obj.__proto__.avator = "我的头像"
    // for in 用来遍历对象
    // 要注意 for in 会遍历原型链上的属性
    for(var key in obj){
        // 使用for in 会遍历到原型链上的属性 这里要进行一下过滤才可以
        if( obj.hasOwnProperty(key) ) {
            console.log(obj[key])
        }
    }

// 顺带提一下for of(用来遍历数组)
//for (var item of arr)
//arr 不能是对象,因为对象是不可迭代的
//但可以遍历数组,并且item已经是值了,而不是属性名
//for of 和for in的另外一点不同是:for of 不会遍历目标原型链上的属性
 

对象属性描述符

如果我们想要对一个属性进行比较精准的操作控制,那么我们就可以使用属性描述符。 通过属性描述符可以精准的添加或修改对象的属性,属性描述符需要使用 Object.defineProperty 来对属性进行添加或者修改。

  • Object.defineProperty(obj,prop,descriptor) 功能:方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。如果不指定configurable, writable, enumerable ,则这些属性默认值为false,如果不指定value, get, set,则这些属性默认值为undefined。 obj要定义属性的对象

prop 要定义或修改属性的名称 或 Symbol

descriptor 要定义或修改的属性描述符

返回值 被传递给函数的对象

数据属性描述符

数据属性描述符四个配置

  • 【configurable】表示属性是否可以通过delete删除,是否可以重新定义属性描述符,或者是否可以将它修改为存取属性描述符;
    • 当我们直接在一个对象上定义某个属性时,这个属性的configurable为true
    • 当我们通过属性描述符定义某个属性时,这个属性的configurable为false
  • 【enumerable】 表示是否可以通过for-in和Object.keys()返回该属性
    • 当我们直接在一个对象上定义某个属性时,这个属性的enumerable为true
    • 当我们通过属性描述符定义某个属性时,这个属性的enumerable为false
  • 【writable】 表示是否可以修改属性的值
    • 当我们直接在一个对象定义某个属时,这个属性的writable为true
    • 当我们通过属性描述符定义某个属性时,这个属性的writable为false
  • 【vaule】 属性的value值,读取属性时返回该值,修改属性时会对其修改
    • 默认都是undefined
javascript">var obj = {
    name: "malong",
    age: 18
};
// 如果使用数据属性描述符 用了value,  不能使用get/set
Object.defineProperty(obj,"address",{
    // 是否可以删除、是否可以重新定义属性描述符、是否可以修改为存取属性描述符 默认值 false
    configurable: true,
    // 可枚举的 (能被遍历)  默认值 false
    enumerable: true, 
    // 可以写入 (能修改属性) 默认值 false
    writable: true,
    // 设置值 默认值 undefined
    value: "深圳"  
})

存取属性描述符:

定义多个属性描述符

  • Object.defineProperties(obj, props) 功能: 方法直接在一个对象上定义一个或多个新的属性或修改现有属性,并返回该对象。

obj:  将要被添加属性或修改属性的对象

props:  该对象的一个或多个键值对定义了将要为对象添加或修改的属性的具体配置

返回值 被传递给函数的对象

javascript">    var obj = {
      _address:''
    };

    Object.defineProperties(obj, {
      age: {
        // 是否可以删除、是否可以重新定义描述符
        configurable: true,
        enumerable: true,
        writable: true,
        value: 18
      },
      address: {
        // 是否可以删除、是否可以重新定义描述符
        configurable: true,
        enumerable: true,

        get() {
          return _address;
        },
        set(value) {
          // 设置address 的时候赋值给_address
          this._address = value;
        }
      }
    })
获取对象属性描述符
javascript">var obj = {
      _address:''
    };

    Object.defineProperties(obj, {
      age: {
        // 是否可以删除、是否可以重新定义描述符
        configurable: true,
        enumerable: true,
        writable: true,
        value: 18
      },
      address: {
        // 是否可以删除、是否可以重新定义描述符
        configurable: true,
        enumerable: true,

        get() {
          return _address;
        },
        set(value) {
          // 设置address 的时候赋值给_address
          this._address = value;
        }
      }
    })
   //获取单个 属性描述符
   console.log( Object.getOwnPropertyDescriptor(obj,"age"))
   // 获取整个对象的属性描述符
   console.log( Object.getOwnPropertyDescriptors(obj))
Object其他的一些方法
javascript">    var obj = {
      name: 'malong',
      age: 18
    }

    // 1.禁止对象继续添加新的属性
    Object.preventExtensions(obj)
    obj.xxx = 'xxx' //无法添加 

    // 2.用for fo遍历对象的key 和 value
    // Object.entries(obj)
    // 返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for...in 循环遍历该对象时返回的顺序一致(区别在于 for-in 循环还会枚举原型链中的属性)
    for (var [key, value] of Object.entries(obj)) {
      console.log(key, value)
    }

    // 3.禁止对象配置/删除里面的属性 for of
    // for (var [key, value] of Object.entries(obj)) {
    //   Object.defineProperty(obj, key, {
    //     configurable: false,
    //     enumerable: true,
    //     writable: true,
    //     value: obj[key]
    //   })
    // }

    // 4.禁止对象配置/删除里面的属性 for in
    // for (var key in obj) {
    //   if (obj.hasOwnProperty(key)) {
    //     Object.defineProperty(obj, key, {
    //       configurable: false,
    //       enumerable: true,
    //       writable: true,
    //       value: obj[key]
    //     })
    //   }
    // }


    // 5.让属性不可配置 configurable 都为 false
    Object.seal(obj)
    // 6.让属性不可以修改 writable 都为 false
    Object.freeze(obj)
    // 7.获取对象的长度 keys()方法只能遍历自己的对象上的可枚举的属性,不能遍历自己原型上可枚举的属性:
    console.log(Object.keys(obj).length)

    // 获取一个对象的所有自身属性的描述符。
    console.log(Object.getOwnPropertyDescriptors(obj))
    
    //更多API请参考MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

vue2响应式原理:

javascript">    var obj = {
      name: "malong",
      age: 18,
      _address:'不希望被暴露的属性' 
    }
    // 如果使用存取属性描述符 用了get/set, 不能使用writable/value
    // 有人读取address会触发get 有人写入address会触发set
    Object.defineProperty(obj, "address", {
      // 可配置的 (能删除属性) 默认值 false
      configurable: true,
      // 可枚举的 (能被遍历)  默认值 false
      enumerable: true,
      get() {
        // 获取属性的时候会自动调用get
        console.log('get')
        return this._address
      },
      set(value) {
        // 设置属性的时候会自动调用set
        this._address = value
      }
    })


http://www.niftyadmin.cn/n/5449801.html

相关文章

Java项目开发之fastjson详解

Fastjson 是由阿里巴巴公司开发的一个 Java 语言编写的高性能 JSON 处理库。它主要用于 Java 对象与 JSON 数据格式之间的转换,提供了简单易用的 API 来实现序列化(Java 对象转 JSON 字符串)和反序列化(JSON 字符串转 Java 对象&a…

Linux中的常用基础操作

ls 列出当前目录下的子目录和文件 ls -a 列出当前目录下的所有内容(包括以.开头的隐藏文件) ls [目录名] 列出指定目录下的子目录和文件 ls -l 或 ll 以列表的形式列出当前目录下子目录和文件的详细信息 pwd 显示当前所在目录的路径 ctrll 清屏 cd…

好书推荐 :《 提问的艺术:让 ChatGPT 给出高质量答案 》

AGI 时代降临!还不知如何向 ChatGPT 提问? 恰当的提示至关重要!《提问的艺术—让 ChatGPT 给出高质量答案》一书,共 24 章,系统介绍了如何向 ChatGPT 提问以获取优质答案,是 ChatGPT 时代的入门指南&#x…

毕业论文的问题猜想及答案整理

如果你的毕业论文是《基于YOLOV5的校园车辆车牌检测与识别系统的设计与实现》,那么在复试中,老师可能会围绕以下几个方面来提问: YOLOV5的基本原理: 你可以介绍一下YOLOV5是如何进行目标检测的吗?YOLOV5相比其他目标检…

Acwing_799最长连续不重复子序列 【双指针 快慢指针】

题目&#xff1a; 代码&#xff1a; #include <bits/stdc.h> #define int long long #define INF 0X3f3f3f3f #define endl \n using namespace std; const int N 100010; int arr[N];int n; signed main(){std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)…

06-验证浮点数输入

鉴于shell脚本的限制和本事&#xff0c;浮点数&#xff08;或“实数”&#xff09;的验证过程乍一看似乎让人望而生畏&#xff0c;不过考虑到浮点数只不过是由小数点分隔的两个整数&#xff0c;再配合能够在脚本中引用其他脚本的能力&#xff08;validint&#xff09;&#xff…

推荐系统的未来:大模型驱动的个性化推荐技术与挑战

推荐系统的未来&#xff1a;大模型驱动的个性化推荐技术与挑战 1. 背景介绍 推荐系统是现代互联网服务中不可或缺的一部分&#xff0c;它通过分析用户的历史行为和偏好&#xff0c;为用户提供个性化的内容推荐&#xff0c;从而提高用户体验和满意度。随着大数据、机器学习和人…

加密算法概述:分类与常见算法

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 在信息安全领域&#xff0c;加密技术是保护数据不被未授权访问的关键手段。Java作为一种广泛使用的编程语言&#xff0c;提供了丰…