对象常用的方法_对象的方法-程序员宅基地

技术标签: JS基础  前端  es6  

思维导图

 

对象中常用的方法:  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)]对象中的每个可枚举的键值对,转为数组返回一个二维数组

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_63358859/article/details/121617438

智能推荐

JavaWeb学习总结_javaweb总结-程序员宅基地

文章浏览阅读2k次。https://www.cnblogs.com/xdp-gacl/category/574705.html_javaweb总结

微众银行面试题-程序员宅基地

文章浏览阅读1.2k次。ES6:1.写一个单实例类(class);2.已知arr=[url1,url2,url3],fetch(url)可获取url的请求结果,请实现按顺序输出异步请求结果(提示:可将fetch转为promiss)Linux & Shell1.linux如何将程序放后台运行?2.有哪些查看机器、程序性能的命令?3.如何检测一个进程存不存在,有没有在运行?4.如何查..._微众银行大数据面试题目

docker的daemon.json基本配置-程序员宅基地

文章浏览阅读5.2k次。说明:个人使用docker过程中的一些配置选项,持续更新·······{//配置仓库镜像地址"registry-mirrors":["https://kzflb.mirror.aliyuncs.com"],//默认http私有仓库不能访问,设置后才可以"insecure-registries":["http://192.168.2.196"],//开启docke..._daemon.json 配置国内

CentOS 7 安装CUDA 11.1 使用rpm包_cuda rmp文件安装-程序员宅基地

文章浏览阅读3.5k次。1 禁用nouveauvim /etc/modprobe.d/blacklist-nouveau.conf填写:blacklist nouveau options nouveau modeset=0执行如下操作sudo mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r)-nouveau.img sudo dracut -v /boot/initramfs-$(uname -r).img $(una.._cuda rmp文件安装

raw_input() 与 input()_js指定rawinput位置-程序员宅基地

文章浏览阅读617次。这两个均是 python 的内建函数,通过读取控制台的输入与用户实现交互。但他们的功能不尽相同。举两个小例子。 1 >>> raw_input_A = raw_input("raw_input: ") 2 raw_input: abc 3 >>> input_A = input("Input: ") 4 Input: abc 5 6 Traceback (most rec_js指定rawinput位置

centos7 php7 动态编译mysqlnd: configure: error: Cannot find OpenSSL's evp.h 错误解决_centos mysqlnd-程序员宅基地

文章浏览阅读6.9k次。centos7 php7 动态编译mysqlnd: configure: error: Cannot find OpenSSL's <evp.h> 错误解决开始以为是没有安装openssl, openssl-devel,安装后发现还是提示这个错误,搜索了一下evp.h,这个文件也存在。GOOGLE 了一下,在stackoverflow,找到了答案,原来是 phpize 生成的con..._centos mysqlnd

随便推点

前端水印实现方案-程序员宅基地

文章浏览阅读406次。大厂技术坚持周更精选好文一、问题背景为了防止信息泄露或知识产权被侵犯,在web的世界里,对于页面和图片等增加水印处理是十分有必要的,水印的添加根据环境可以分为两大类,前端浏览器环境..._前端水印生成方案

PAT B1049/A1104 题解_pat b1049 c-程序员宅基地

文章浏览阅读254次。1104 Sum of Number Segments (20 分)Given a sequence of positive numbers, a segment is defined to be a consecutive subsequence. For example, given the sequence { 0.1, 0.2, 0.3, 0.4 }, we have 10 segme..._pat b1049 c

解决linux/config.h: No such file or directory_conin.h 没有那个文件或目录-程序员宅基地

文章浏览阅读1.9w次,点赞4次,收藏3次。问题: “linux/config.h: No such file or directory”原因与解决方法: 原因是2.6.19之后的内核没有了config.h文件,因此直接把对应的include注释掉即可。 或者添加头文件#include_conin.h 没有那个文件或目录

php微信分享带缩略图,网站实现微信分享带缩略图-程序员宅基地

文章浏览阅读289次。做网站的微信分享,之前一直获取不到缩略图和描述。后来总结了下经验。分享给大家参考。首先做微信分享我们需要一个 已经认证了的微信公众号 去绑定要分享的网站。然后设置服务器的白名单重点就是获取jssdk文件了。看文档说明wx.config({debug:true,// 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在p..._php 微信分享缩略图

简单背包问题(0032)_设有 一个 背包 能承 受重量 s(s>0), 又有 n(n>=1) 件物 品, 其 重 量 列 表-程序员宅基地

文章浏览阅读1.2k次。简单背包问题(0032)Time limit(ms): 1000Memory limit(kb): 65535Submission: 5792Accepted: 1753Didn't trying 搜索 动态规划 设有一个背包可以放入的物品重量为S,现有n件物品,重量分别是w1,w2,w3,…wn。 _设有 一个 背包 能承 受重量 s(s>0), 又有 n(n>=1) 件物 品, 其 重 量 列 表 为w=

一文看懂Web后端开发-程序员宅基地

文章浏览阅读2.8w次,点赞108次,收藏390次。一文看懂Web后端开发前言由于网络上系统地介绍后端开发的文章实在太少,而最近有恰巧有许多同学问我“什么是后端开发?”、“你为什么喜欢后端开发?”、“做后端都需要学什么?”,那么我们就来讲一讲,到底什么才是后端开发。定义后端开发(Back-End Development,也称服务端开发、服务器端开发等)是创建完整可运行的Web应用服务端程序(服务端程序和资源合称为后端,即在服务器上运行的、不涉及用户界面的部分)的过程,是Web应用程序开发的一部分。后端开发者使用Java、Golang等语言及其衍生的各_web后端开发

推荐文章

热门文章

相关标签