对象常用的方法

2023-11-14

思维导图

 

对象中常用的方法:  Object.prototype

1. hasOwnProperty 

  • 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)。 检测是否为私有属性
  • 即使属性的值是 null 或 undefined,只要属性存在,hasOwnProperty 依旧会返回 true。检测的属性的 String 字符串形式表示的名称,或者 Symbol
const object1 = {};
object1.property1 = 42;

console.log(object1.hasOwnProperty('property1'));
// expected output: true

console.log(object1.hasOwnProperty('toString'));
// expected output: false

console.log(object1.hasOwnProperty('hasOwnProperty'));
// expected output: false

2. toString

  • 检测数据类型的  Object.prototype.toString.call([value])

var toString = Object.prototype.toString;

toString.call(new Date); // [object Date]
toString.call(new String); // [object String]
toString.call(Math); // [object Math]

不常用

  •    + isPrototypeOf 方法用于测试一个对象是否存在于另一个对象的原型链上。
  •     + valueOf方法返回指定对象的原始值。
  •     + propertyIsEnumerable方法返回一个布尔值,表示指定的属性是否可枚举

  把Object作为一个普通对象,学习其静态私有属性方法  -> Object.xxx()

- **跟规则没关系的方法==3==个:**

  1. Object.assign(obj1,obj2,...)

合并两个(或多个)对象,让obj2及以后的对象替换obj1中的内容,返回obj1

    //Object.assign(obj1,obj2,...) 合并两个(或多个)对象,让obj2及以后的对象替换obj1中的内容,返回obj1
    const obj1 = { a: 1, b: 2 };
    const obj2 = { b: 4, c: 5 };

    const newObject = Object.assign(obj1, obj2);
    console.log(obj1);
    //{a: 1, b: 4, c: 5}
    console.log(newObject);
    //{a: 1, b: 4, c: 5}
    //newObject===obj1//true

2.Object.create(obj)

创建一个空对象,并且把obj作为其原型对象    返回值:一个新对象,带着指定的原型对象和属性。

   let obj = { name: "lisa" }
    let obj2 = Object.create(obj)
    console.log(obj2);
实现继承--------------------
 // Shape - 父类(superclass)
    function Shape() {
        this.x = 0;
        this.y = 0;
    }
    Shape.prototype.move = function (x, y) {
        this.x += x;
        this.y += y;
        console.info('Shape moved.');
    };

    // Rectangle - 子类(subclass)
    function Rectangle() {
        Shape.call(this); // call super constructor.
    }

    // 子类续承父类
    let son = Rectangle.prototype = Object.create(Shape.prototype);
    let son2 = Rectangle.prototype.constructor = Rectangle;
    console.log(son);
    console.log(son2);

3.Object.is(value1,value2)`

基于三个等于号,绝对相等进行比较的【ES6新增】        

  let obj = Object.is(NaN, NaN)
    console.log(obj);//true 这里可以判断一个值是不是NaN,做的也是全等比较

对象中属性操作的方法

1.`Object.defineProperty(obj,key,descriptor)`

:==对当前对象中的某个属性进行监听或劫持,以及设置一些规则==

    let obj = {
        name: 'lisa'
    };
    let proxy = { ...obj };
    Object.defineProperty(obj, 'name', {
        get() {
            // 当我们获取obj的name属性值的时候,会触发GETTER函数,方法返回的值就是获取的属性值
            console.log('GETTER');
            return proxy.name;
        },
        set(value) {
            // 当我们设置name属性值的时候,会触发SETTER函数,value是需要新设置的值
            console.log('SETTER', value);
            proxy.name = value;
        }
    });
    console.log(obj.name);
    obj.name = 'red';
  • 2. `configurale:true`:是否可以基于delete删除name属性
  • 3. `enumerable:true`:是否是可枚举的name属性,如果不可枚举,则for/in/Object.key()等操作无法遍历到该属性
  • 4. ` writable:true`:是否可以修改值【只要设置了该描述,不管true或false,都不能使用get/set方法】
  • 5.  `get(){return xxx}`:对获取obj.name属性操作进行拦截,return的值,就是真正获取到的值
  • 6. set(value){xxx}`:对设置obj.name=value操作进行拦截,并执行函数体内的操作
  • `7. Object.getOwnPropertyDescriptor(obj,key)`:获取obj中key属性所设置的规则的状态(可删除/枚举/修改..)

  • 8.Object.getOwnPropertyDescriptors(obj)`:获取obj中每一个属性所设置的规则的状态


let obj = { name: 'lisa', age: 13 };
Object.defineProperty(obj, 'name', {
    // 是否可以基于delete删除
    configurable: false,
    // 是否是可以枚举的,如果是不可枚举的属性,则基于for/in循环或者Object.keys等操作都无法获取这个属性
    enumerable: false,
    // 是否可以修改值「不能和get/set同时设置」
    // writable: true,
    get() { },
    set() { }
}); 

获取当前对象不同类型的键或值==5==个:

1.`Object.getOwnPropertyNames(obj)`:获取当前对象所有非Symbol类型的私有属性【含不可枚举的】

    let obj = { name: 'xxx', age: 13, [Symbol('AA')]: 200 };
    Object.defineProperty(obj, 'name', { enumerable: false });
    let keys = Object.getOwnPropertyNames(obj);
    console.log(keys); //['name', 'age',] 

2.`Object.getOwnPropertySymbols(obj)`:获取当前对象所有**Symbol**类型的私有属性【含不可枚举的】

    let obj = { name: 'xxx', age: 13, [Symbol('AA')]: 200 };
    Object.defineProperty(obj, obj[Symbol('AA')], { enumerable: false });
    let keys = Object.getOwnPropertySymbols(obj);
    console.log(keys); //[Symbol(AA)

3.`Object.keys(obj)`:获取当前对象所有非Symbol类型且可枚举的私有属性名【不能获取不可枚举的】

    let obj = { name: 'xxx', age: 13, [Symbol('AA')]: 200 };
    Object.defineProperty(obj, "name", { enumerable: false });
    let keys = Object.keys(obj);
    console.log(keys); //['age']

4.Object.values(obj)`:获取当前对象所有非Symbol类型且可枚举的私有属性值

    let obj = { name: 'xxx', age: 13, [Symbol('AA')]: 200 };
    Object.defineProperty(obj, "name", { enumerable: false });
    let keys = Object.values(obj)
    console.log(keys); //['13']

5.  Reflect.ownKeys获取所有私有属性【包含各种类型及可枚举和不可枚举的】

    let obj = { name: 'xxx', age: 13, [Symbol('AA')]: 200 };
    Object.defineProperty(obj, "name", { enumerable: false });
    let keys =  Reflect.ownKeys(obj)
    console.log(keys); //['name', 'age', Symbol(AA)]

冻结:

  • 不让其设置defineProperty劫持
  • `Object.freeze(obj)`:冻结,把一个对象进行冻结,目的是让其不能在再基于Object.defineProperty做劫持,
  • 后续可以基于`Object.isFrozen(obj):`检测对象是否是冻结的
   let obj = { name: 'lisa', age: 13 };
    Object.freeze(obj)
    Object.defineProperty(obj, 'name', {
        get() { },
        set() { }
    });
    //Uncaught TypeError: Cannot redefine property: name无法重新定义属性:name
    console.log(Object.isFrozen(obj));//true 检测对象是否是冻结的

设置和获取原型:

  • -  Object.getPrototypeOf(obj)`:获取`obj.__proto__`指向的原型
  •   - `Object.setPropertyOf(obj,property)`:设置obj原型对象`obj.__proto__===prototype`
 let obj = { name: 'lisa', age: 13 };
    let property = { name: 'red', age: 28 };
    Object.getPrototypeOf(obj)//constructor: ƒ Object()
    Object.setPrototypeOf(obj, property)//{name: 'lisa', age: 13}

 **阻止扩展*:不能再为其设置新的属性

  •  - `Object.preventExtensions(obj)`:把obj变为不可扩展对象
  •   - `Object.isExtensible(obj)`:判断一个对象是不是可扩展对象
let obj = { name: 'lisa', age: 13 };
    Object.preventExtensions(obj);
    obj.sex = "男"
    console.log(obj);//{name: 'lisa', age: 13,}
    console.log(Object.isExtensible(obj));//false不可扩展

**封存:**

  • 不允许添加或删除对象中的属性,但允许修改对象中存在的属性
  •   `Object.seal(obj)`:封存对象,不允许添加或删除对象中的属性,但允许修改对象中存在的属性
  •   - `Object.isSealed(obj)`:判断一个对象是否封存了。
 let obj = { name: 'lisa', age: 13 };
    Object.seal(obj);
    obj.sex = "男";
    console.log(obj); //{ name: 'lisa', age: 13 }
    obj.age = 28;
    console.log(obj);//{name: 'lisa', age: 28}
    Object.isSealed(obj)//true 不允许添加或删除对象中的属性,但允许修改对象中存在的属性

- **对象的属性与二维数组互相转换:*

  • `Object.entries(obj):`将对象中的每个==可枚举的==键值对转为数组,返回一个二维数组
  •   - `Object.fromEntries(arr)`:将二维数组的各数据项,转换为对象,返回一个对象
 let obj = { name: 'lisa', age: 13 };
    let arr = Object.entries(obj)
    console.log(arr);//[Array(2) Array(2)]对象中的每个可枚举的键值对,转为数组返回一个二维数组

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对象常用的方法 的相关文章

  • 前端性能优化:7.页面渲染优化

    本文将主要关注浏览器获取到资源后 进行渲染部分的相关优化内容 7 1 页面渲染性能 页面渲染阶段对性能体验的应i昂与资源加载阶段同样重要 而对于设计高交互频次的应用来说可能更加重要 本节将整个渲染过程划分为五个串行阶段进行概述 优化渲染的实

随机推荐

  • 大众点评校招助理产品经理-笔试题分析(下)

    针对大众点评网的任何一个产品的一个需要改进的点 信息 数据或功能体验都行 给出你的分析和改进规划 希望尽可能的全面 深入 详细 1 改进产品版本与使用机型 使用版本 大众点评Android客户端V5 2版本 机型 HTC Desire HD
  • memset in C++ and C

    definition memset是计算机中C C 语言函数 将s所指向的某一块内存中的前n个 字节的内容全部设置为ch指定的ASCII值 第一个值为指定的内存地址 块的大小由第三个参数指定 这个函数通常为新申请的内存做初始化工作 其返回值
  • Failed to execute goal org.apache.maven.plugins:maven-checkstyle-plugin

    idea编译项目时 出现如下报错 ERROR Failed to execute goal org apache maven plugins maven checkstyle plugin 3 0 0 check validate on p
  • k8s学习笔记(二):k8s的组件介绍

    文章目录 k8s组件介绍 架构图 角色 控制平面组件 Control Plane Components kube apiserver 端口 容器 etcd 端口 容器 kube scheduler 容器 端口 kube controller
  • Postman脚本——断言测试

    pm对象提供了测试相关功能 pm test testName String specFunction Function Function 测试函数 pm expect assertion Function Assertion 允许在响应数据
  • [552]python实现聚类算法(6种算法)

    1 Mean shift 1 概述 Mean shift 即 均值迁移 的基本思想 在数据集中选定一个点 然后以这个点为圆心 r为半径 画一个圆 二维下是圆 求出这个点到所有点的向量的平均值 而圆心与向量均值的和为新的圆心 然后迭代此过程
  • AI炼丹技巧

    目录 样本不平衡 1 什么是样本不平衡问题 2 样本不平衡会对我们模型的训练带来哪些影响呢 3 在机器学习中解决样本不平衡问题有哪些通用的解决策略 4 在深度学习中 有哪些解决样本不平衡的方法 5 从模型评价指标的角度 重新审视训练好的模型
  • 计算机中丢失msvcp140.dll怎么解决?分享三个解决方法

    当我们在运行某些应用程序时 可能会遇到 缺少msvcp140 dll 或 找不到msvcp140 dll 的错误提示 这意味着我们的系统缺少这个重要的动态链接库文件 msvcp140 dll丢失会造成很多软件无法正常启动运行 下面小编就分享
  • 全网最全!Python爬虫requests库教程(附案例)

    1 requests 库简介 Requests 是一个为人类设计的简单而优雅的 HTTP 库 requests 库是一个原生的 HTTP 库 比 urllib3 库更为容易使用 requests 库发送原生的 HTTP 1 1 请求 无需手
  • 【MySQL高级篇笔记-性能分析工具的使用 (中) 】

    此笔记为尚硅谷MySQL高级篇部分内容 目录 一 数据库服务器的优化步骤 二 查看系统性能参数 三 统计SQL的查询成本 last query cost 四 定位执行慢的 SQL 慢查询日志 1 开启慢查询日志参数 2 查看慢查询数目 3
  • 常见的排序算法及其复杂度分析

    1 常见算法分类 十种常见排序算法一般分为以下几种 非线性时间比较类排序 交换类排序 快速排序和冒泡排序 插入类排序 简单插入排序和希尔排序 选择类排序 简单选择排序和堆排序 归并排序 二路归并排序和多路归并排序 线性时间非比较类排序 计数
  • 黑盒测试与白盒测试的区別

    黑盒测试与白盒测试是软件测试中两种不同的测试方法 它们的主要区别在于测试者对被测试软件的了解程度 下面 我们将详细介绍这两种测试方法的特点和适用场景 一 黑盒测试 黑盒测试又称为功能测试 是针对被测试软件的功能进行测试的一种测试方法 测试者
  • linux 进程几种状态,linux进程状态

    linux系统最常用的命令莫过于ps 经常要用其查看linux的进程和线程情况 此文我们着重来看进程 进程又分为以下几种状态 1 运行 正在运行或在运行队列中等待 2 中断 休眠中 受阻 在等待某个条件的形成或接受到信号 3 不可中断 收到
  • Kotlin Coroutines Flow 系列(一) Flow 基本使用

    一 Kotlin Flow 介绍 Flow 库是在 Kotlin Coroutines 1 3 2 发布之后新增的库 官方文档给予了一句话简单的介绍 Flow cold asynchronous stream with flow build
  • C# socket异步通信服务器和客户端

    本文章向大家介绍C socket异步通信服务器和客户端 主要包括C socket异步通信服务器和客户端使用实例 应用技巧 基本知识点总结和需要注意事项 具有一定的参考价值 需要的朋友可以参考一下 服务器代码 只要客户端连接进来就会接收到Se
  • Qt之QTableView 保持滚动条自动滚动到底部

    在使用QTableView添加数据时 当数据量超出显示范围时会自动的打开滚动条 如果设置了在需要时打开滚动条属性 而默认的是滚动条一直是保持在最顶部 但是有些时候我们添加数据时是需要查看添加的最新结果的 所以一般都会把滚动条滚动到最新数据那
  • 【scrapy】scrapy爬取数据指南

    scrapy是爬虫界常用的基于Python爬虫框架 但是网上找了很多这类的文章 发现有多处错误 故为了让刚想尝试爬虫的蜘蛛们少走点坑 故把最新的方法奉上 在此之前 请先更新你的pip版本 并安装scrapy pymysql pip inst
  • kernelbase.dll崩溃的处理_kernelbase.dll故障教程

    kernelbase dll是存放在windows系统下的一个非常重要的dll文件 DLL英文全称Dynamic Link Library 中文意思是 动态链接库 DLL是一个作为共享函数库的可执行文件 它使进程可以调用不属于本身可执行代码
  • java 代理模式

    1 静态代理 1 1 代码实现 接口 interface Hello String sayHello String str 实现 class HelloImp implements Hello Override public String
  • 对象常用的方法

    思维导图 对象中常用的方法 Object prototype 1 hasOwnProperty 方法会返回一个布尔值 指示对象自身属性中是否具有指定的属性 也就是 是否有指定的键 检测是否为私有属性 即使属性的值是 null 或 undef