Object方法

news/2024/5/18 19:35:19/文章来源:https://blog.csdn.net/qq_60306931/article/details/130066564

系列文章目录

前端系列文章——传送门
JavaScript系列文章——传送门


文章目录

  • 系列文章目录
  • 对象方法
    • 一、Object原型方法
      • 1、hasOwnProperty
      • 2、isPrototypeOf
      • 3、propertyIsEnumerable
      • 4、toString
      • 5、其他
    • 二、Object方法
      • 1、assign
      • 2、create
      • 3、defineProperties
      • 4、defineProperty
      • 5、entries
      • 6、freeze
      • 7、fromEntries
      • 8、getOwnPropertyDescriptors
      • 9、getOwnPropertySymbols
      • 10、getPrototypeOf
      • 11、hasOwn
      • 12、is
      • 13、isExtensible
      • 14、isFrozen
      • 15、keys
      • 16、preventExtensions
      • 17、setPrototypeOf
      • 18、seal
      • 19、values
    • 三、ES6的对象操作
      • 1、Symbol
      • 2、Reflect
      • 3、Proxy


对象方法

一、Object原型方法

Object构造函数对应的原型中有很多方法,比较实用,如下:

console.log(Object.prototype)

图示:

在这里插入图片描述

1、hasOwnProperty

用于判断某个对象是否具有某个自带属性。自带属性,指的是自身就有的,而非继承来的,语法:

对象.hasOwnProperty(非继承属性) // 返回布尔值,true表示是,false表示否

例:

function Person(name, age) {this.name = namethis.age = age
}Person.prototype.sex = '男'var man = new Person('张三', 12)console.log( man.hasOwnProperty('name') ); // true
console.log( man.hasOwnProperty('sex') ); // false
console.log( man.hasOwnProperty('height') ); // false

只有自己内非继承的属性才能返回true,继承的和不是自己的属性都是false。

2、isPrototypeOf

用于判断一个对象是否在另一个对象的原型链上。语法:

对象a.isPrototypeOf(对象b) // 判断对象a是否在对象b的原型链上,返回布尔值

例:

function Animal() {}var ani = new Animal()function Bird() {}Bird.prototype = anivar maque = new Bird()console.log( Object.prototype.isPrototypeOf(maque) ); // true
console.log( ani.isPrototypeOf(maque) ); // true
var ani1 = new Animal()
console.log( ani1.isPrototypeOf(maque) ); // false

3、propertyIsEnumerable

用于判断是否可以从对象中遍历得到某个属性,语法:

对象.propertyIsEnumerable(属性名) // 返回布尔值

例:

function Person(name, age) {this.name = namethis.age = age
}Person.prototype.sex = '男'var man = new Person('张三', 12)console.log( man.propertyIsEnumerable('name') ) // true - 自己的属性可以遍历
console.log( man.propertyIsEnumerable('sex') ) // false - 继承来的属性无法遍历

4、toString

用于将对象转成字符串,语法:

对象.toString() // 返回'[object Object]'

5、其他

toLocaleStringvalueOf没有实际的效果,是为了让子原型能具备这些方法,来实现不同类型数据的功能。

toLocaleString给不同的数据调用会得到不同的数据:

// 对象调用
var obj = {name: '张三', age: 123456}
console.log( obj.toLocaleString() ); // [object Object]// 字符串调用
var str = 'abcdefg'
console.log( str.toLocaleString() );  // abcdefg// 数字调用
var num = 123456789
console.log( num.toLocaleString() ); // 123,456,789// 布尔值调用
var bool = true
console.log( bool.toLocaleString() ); // true// 时间日期对象调用
var date = new Date()
console.log( date.toLocaleString() ); // 2022/11/4 09:20:01

只有数字和时间日期对象调用的时候,能起到作用,其他类型的数据调用后,会默认调用toString方法转成字符串而已。

valueOf给不同类型的对象调用功能是不同的:

// 对象调用
var obj = {name: '张三', age: 123456}
console.log( obj.valueOf() ); // {name: '张三', age: 123456}// 字符串调用
var str = new String('abcdefg')
console.log( str.valueOf() );  // abcdefg// 数字调用
var num = new Number(123456789)
console.log( num.valueOf() ); // 123456789// 布尔值调用
var bool = new Boolean(true)
console.log( bool.valueOf() ); // true// 时间日期对象调用
var date = new Date()
console.log( date.valueOf() ); // 1667525014847

时间日期对象调用能获取到时间戳,其他类型的对象调用,会得到具体的值,相当于console.log(数组/对象)的值

二、Object方法

Object本身也有一些实用的方法:

console.dir(Object)

图示:

在这里插入图片描述

1、assign

用于将一个对象中可遍历的属性复制到另一个目标对象中,返回目标对象,语法:

var 新目标对象 = Object.assign(原目标对象, 被复制的对象)

例:

var obj = {name: '张三',age: 12
}var pbj = {sex: '男',height: 180
}pbj.__proto__.weight = 150 // 不可遍历属性无法复制var qbj = Object.assign(obj, pbj) // 将pbj中的属性复制到obj中console.log(obj); // {name: '张三', age: 12, sex: '男', height: 180}
console.log(qbj); // {name: '张三', age: 12, sex: '男', height: 180}
console.log(obj === qbj); // true

通常用于做浅克隆,将一个对象中的属性复制在另一个空对象中。

2、create

用于创建一个对象,并指定这个对象的原型,语法:

var 对象 = Object.create(指定的原型对象, {对象键值对的描述}) // 返回创建好的对象

参数1必填,例:

var obj = Object.create()

报错如下:

表示参数1必填,且参数必须是一个对象或null。

参数2是可选项,默认是空对象

例:

var obj = Object.create(null)
console.log(obj); // 这个对象没有原型

创建的是一个空对象,且这个对象没有原型

var pro = {name: '张三'
}var obj = Object.create(pro)
console.log(obj);

创建的是一个空对象,原型为pro对象

参数2中的键,是对象要拥有的键,值必须是一个对象,用于对属性的描述,描述的对象语法如下:

{value: 123, // 属性的值writable: false, // 属性是否可修改enumerable: true, // 属性是否可遍历configurable: false, // 属性是否可删除get: undefined, // 访问属性值的时候执行什么程序set: undefined // 设置属性值的时候执行什么程序
}

例:

var obj = Object.create(null, {age: {value: 12,writable: true,enumerable: true,configurable: true,},
})
console.log(obj);

3、defineProperties

用于给对象添加或修改一个属性,语法:

Object.defineProperties(对象, {对象键值对的描述}) // 返回处理后的对象

例:

var pro = {name: '张三'
}var obj = Object.defineProperties(pro, {age: {value: 12,writable: true,enumerable: true,configurable: true,},
})
console.log(obj);

4、defineProperty

用于监视对象某个属性被访问或被修改的操作,语法:

Object.defineProperty(对象, 属性名, {// 对象属性的描述writable: false, // 属性是否可修改enumerable: true, // 属性是否可遍历configurable: false, // 属性是否可删除get: undefined, // 访问属性值的时候执行什么程序set: undefined // 设置属性值的时候执行什么程序
})

例:

Object.defineProperty(obj, 'name', {writable: false, // 属性是否可修改enumerable: true, // 属性是否可遍历configurable: false, // 属性是否可删除get: function() { // 访问属性值的时候执行什么程序return// 当访问obj.name的时候会得到这个返回的值},set: function(val){ // 设置属性值的时候执行什么程序// 当给obj.name赋值的时候会在这里截获到他的值为val}
})
console.log( obj.name );
obj.name = '李四'

案例:数据和视图双向绑定

<body>
<input type="text">
</body>
<script>
function ViewModel(msg) {this.msg = msg
}var vm = new ViewModel('哈哈')var input = document.querySelector('input')input.value = vm.msgObject.defineProperty(vm, 'msg', {configurable: false,enumerable: true,get: function() {return input.value},set: function(val) {input.value = val}
})input.oninput = function() {vm.msg = this.value
}</script>

改变文本框的值,对象的值会改变,改变对象的值,文本框的值也会改变。

5、entries

用于将对象中可遍历的键值对组成一个数组并返回,语法:

Object.entries(对象) // 返回数组

例:

var obj = {name: '张三',age: 12
}Object.defineProperties(obj, {sex: {value: '男',enumerable: false,}
})console.log(obj);var arr = Object.entries(obj)console.log(arr);

6、freeze

用于冻结一个对象,让对象不能新增、不能修改、不能删除、不能改原型,不能改属性的特性,语法:

var 对象 = Object.freeze(对象) // 返回被冻结的对象

例:

var obj = {name: '张三',age: 12
}obj = Object.freeze(obj)console.log(obj);obj.sex = '男'
console.log(obj);obj.name = '李四'
console.log(obj);delete obj.age
console.log(obj);obj.__proto__ = {height: 180}
console.log(obj.height);

如果对象中的值,是一个对象,里面的小对象是没有被冻结的,也就说这种冻结只是浅冻结:

var obj = {name: '张三',age: 12,wife: {name: '翠花',age: 13}
}
obj = Object.freeze(obj) obj.wife.sex = '女'console.log(obj);

若要深冻结,需要手动写递归函数实现:

var obj = {name: '张三',age: 12,wife: {name: '翠花',age: 13}
}function deepFreeze(data) {for(var key in data) {if({}.toString.call(data[key]) === '[object Object]') {deepFreeze(data[key])}}return Object.freeze(data)
}obj = deepFreeze(obj)
console.log(obj);obj.wife.sex = '女'
console.log(obj);

冻结数据可以提高性能,一个数据确保后面都不会修改的话,就可以将他冻结。

7、fromEntries

跟entries的作用相反,将一个map格式的数组(多个键值对组成的数组)转成一个对象,语法:

Object.fromEntries(map格式的数据) // 返回键值对组成的对象

例:

var arr = [['name', '张三'], [{age: 12}, '哈哈']
]var obj = Object.fromEntries(arr)console.log(obj);

可以将map转成对象。

8、getOwnPropertyDescriptors

获取对象中某个属性对应的描述对象。

9、getOwnPropertySymbols

将对象中所有symbol属性,组成一个数组。

10、getPrototypeOf

获取对象的原型对象。

11、hasOwn

判断一个属性是否属于某个对象,而不是被继承来的。跟hasOwnProperty的功能一样。

12、is

用来判断两个数据是否相等,但是跟=====都不一样,基本类型数据,判断数据看起来是否相等,引用数据类型比较地址跟===一样,语法:

Object.is(数据1, 数据2) // 返回布尔值

例:

// 基本类型
var a = NaN
var b = NaN
console.log(a == b); // false
console.log( Object.is(a ,b) ); // true - 表面看起来一样var a = -0
var b = +0
console.log(a === b); // true
console.log( Object.is(a, b) ); // false - 表名看起来不一样// 引用类型
var a = {}
var b = {}
console.log(a === b); // false
console.log( Object.is(a, b) ); // false

13、isExtensible

用于判断一个对象是否可扩展(是否可以给对象添加属性)。冻结对象、密封对象不可以扩展。

14、isFrozen

用于判断一个对象是否被冻结。

15、keys

获取对象中所有键组成的数组。

16、preventExtensions

用于将一个对象变得不可扩展。

17、setPrototypeOf

用于给对象设置原型。

18、seal

封闭一个对象,让对象不能添加新属性、不能删除键值对,语法:

Object.seal(要被封闭的对象) // 返回被封闭的对象

例:

var obj = {name: '张三'
}Object.seal(obj)delete obj.name
console.log(obj);obj.age = 12
console.log(obj);obj.name = '李四'
console.log(obj);

19、values

获取对象中所有值组成的数组。

三、ES6的对象操作

1、Symbol

object的键都是字符串,且都是唯一的,不能重复。假设,我们使用一个别人提供的object,但是需要给这个object添加一个新的键值对,自己添加的键就有可能会跟object中原本的键冲突。symbol的主要作用就是创建对象中独一无二的键,可以从根本上防止对象中的键重复。

也就是说,对象中的键除了是字符串以外,还可以是symbol数据。

symbol数据通过Symbol函数生成,语法如下:

var s = Symbol()
console.log(s);
console.log(typeof s);

Symbol是一个函数,但不是一个构造函数,如果将Symbol当做构造函数new使用,会报错。

var s = new Symbol()
console.log(s);

Symbol函数可以接受字符串参数,同一个字符串得出的两个symbol是不相等的,这样就保证了每一个symbol数据都是独一无二的:

var s = Symbol('name')
var s1 = Symbol('name')
console.log(s == s1); // false

如果symbol的参数是一个对象,会默认调用对象的toString方法得到字符串:

var obj = {name: '张三'
}var s = Symbol(obj)
console.log(s);var pbj = {name: '李四',toString: function(){return this.name}
}var s1 = Symbol(pbj)
console.log(s1);

symbol数据作为对象的键使用,可以保证每个键都是唯一的:

var obj = {name: '张三',age: 12
}
// 想给对象添加name属性和age属性,可以对象中已经有了name属性和age属性了,此时就将name和age做成symbol数据,然后将symbol数据当做对象的键使用
// 通过name和age做成symbol数据
var nameSymbolKey = Symbol('name')
var ageSymbolKey = Symbol('age')
// 将symbol数据当做对象的键
obj[nameSymbolKey] = '李四'
obj[ageSymbolKey] = 13
console.log(obj);

symbol数据不能跟其他数据进行运算,不能进行隐形类型转换:

var s = Symbol(0)
var sum = s + 2
console.log(sum);

其他隐形转换都会报错:

var s = Symbol(0)
var str = s + 'abc' // 报错console.log(Number(s)) // 报错

Symbol可以强制转换成字符串和布尔值:

var s = Symbol()console.log( String(s) );
console.log(s.toString());
console.log(Boolean(s));

通过symbol数据的description属性得到symbol数据创建时的字符串参数:

var s = Symbol('abc')
console.log(s.description) // abc

2、Reflect

解决对象访问、修改、删除后我们无法知道是否成功的问题。

问题:当一个对象封闭后,无法添加属性,但我们并不知道是否添加成功

var obj = {name: '张三'
}Object.seal(obj)obj.age = 12
console.log(obj);

结果没有给将age添加到obj上,假设我们并不知道这个对象是封闭的,添加了属性但没添加成功,我们会觉得莫名其妙。删除和修改同理。

使用Reflect进行添加、修改、删除就能知道是否成功了,语法:

Reflect.get(对象,) // 返回值或undefined	
Reflect.set(对象,,) // 给对象添加键值对,返回布尔值
Reflect.deleteProperty(对象,) // 删除对象键值对,返回布尔值

例:

ar obj = {name: '张三'
}Object.seal(obj)// 添加
var bool1 = Reflect.set(obj, 'age', 12)
console.log(bool1); // false// 删除
var bool2 = Reflect.deleteProperty(obj, 'name')
console.log(bool2); // false// 访问
var bool3 = Reflect.get(obj, 'name')
console.log(bool3); // '张三'var bool3 = Reflect.get(obj, 'aaa')
console.log(bool3); // undefinedvar pbj = {name: '李四'
}// 添加
var bool1 = Reflect.set(pbj, 'age', 12)
console.log(bool1); // true// 删除
var bool2 = Reflect.deleteProperty(pbj, 'name')
console.log(bool2); // true

Reflect是将对象基本操作换成了函数写法,有了返回值,方便我们进行判断了。

3、Proxy

创建一个被劫持/监听的对象,当访问、设置、删除对象键值对的时候会被监视到,和defineProoerty的功能是一样的。语法:

var obj = {name: '张三'
}var pbj = new Proxy(obj, {get(object, key) {console.log(object, key);return 111},set(object, key, val) {console.log(object, key, val);}
})pbj.name = '张三' // {name: '张三'} 'name' '张三'console.log( pbj.name ); // {name: '张三'} 'name'     111

实现数据和视图的双向绑定:

<body>
<input type="text">
</body>
<script>
var input = document.querySelector('input')
var data = {msg: '哈哈'
}
input.value = data.msg
var vm = new Proxy(data, {get(obj, key) {return input.value},set(obj, key, val) {input.value = val}
})
input.oninput = function() {vm.msg = this.value
}
</script>

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于C#编程建立Vector数据类型及对应处理方法

以C#为例&#xff0c;讲解如何建立一个类&#xff0c;这其中需要考虑需要什么样的数据&#xff08;成员&#xff09;&#xff0c;什么样的属性以及方法&#xff0c;以及提供给外部程序调用&#xff0c;最后考虑怎么样去实现这样的算法。例如对于一个向量Vector&#xff08;类&a…

【深度学习】rnn是什么?循环神经网络是什么?RNN前向传播。

文章目录循环神经网络1.循环神经网络原理2.使用Numpy实现RNN层的前向传播3.RNN存在的问题4.小结循环神经网络 通常卷积神经网络 适合处理图像问题&#xff0c;然而通常适合处理自然语言的网络是循环神经网络。rnn是所有基本网络&#xff0c;就像cnn 是很多复杂网络的基本原型。…

leedcode刷题(3)

各位朋友们大家好&#xff0c;今天是我leedcode刷题系列的第三篇&#xff0c;废话不多说&#xff0c;直接进入主题。 文章目录分割链表题目要求用例输入提示做题思路c语言代码实现Java代码实现相交链表题目要求用例输入提示做题思路c语言实现代码Java代码实现分割链表 leedcod…

《 LeetCode 热题 HOT 100》——无重复字符的最长子串

本期给大家带来的是 LeetCode 热题 HOT 100 第三题关于 无重复字符的最长子串 的讲解。首先&#xff0c;我们还是先从题目入手进行分析思考&#xff01;&#xff01;&#xff01; 题目如下 &#xff1a;&#x1f447; 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符…

改进蚁狮优化算法

目录 ​1 主要内容 2 部分程序 3 程序结果 4 程序链接 ​1 主要内容 该程序方法复现《改进蚁狮算法的无线传感器网络覆盖优化》两种改进算法模型&#xff0c;即原始ALO算法的基础上添加了两种改进策略&#xff1a; - 改进1&#xff1a;将原先的间断性边界收缩因子变为连…

【Android开发经验】-- 如何实现RecyclerView子项的点击事件?

目录 实例 实现思路 实现代码 进一步需求&#xff1a;数据库存储 实例 假设现在需要完成一个以下需求的任务&#xff0c;下面两个图左边是点击前未完成&#xff0c;右边是点击后已完成&#xff0c;如何实现点击图标切换另一个图标&#xff1f;&#xff08;矩形框中的内容是…

医药产品经理渠道资源获取的方法有哪些?

收集渠道信息是医药产品经理非常重要的工作之一&#xff0c;以下是一些可行的方法&#xff1a; 与销售人员和客户服务团队交流 销售人员和客户服务团队是企业与患者、医生和医院进行联系的主要渠道。他们可以提供很多有关市场需求和竞争对手情况的信息。产品经理可以通过与销…

机械臂动力学参数辨识学习笔记

1、为什么需要动力学参数辨识&#xff1f; 图1 电机三环控制图 通常情况下&#xff0c;标准的工业控制器通过机械臂内部的PID进行调节控制机械臂的运动&#xff0c;即用PID输出力矩&#xff0c;涉及到经典的图一所示的电机三环控制&#xff08;位置环、速度环、电流环&#xff…

用机器学习sklearn+opencv-python过古诗文网4位数字+字母混合验证码

目录 获取验证码图片 用opencv-python处理图片 制作训练数据集 训练模型 识别验证码 编写古诗文网的登录爬虫代码 总结与提高 源码下载 在本节我们将使用sklearn和opencv-python这两个库过掉古诗文网的4位数字字母混合验证码&#xff0c;验证码风格如下所示。 验证码获…

DM的学习心得和知识总结(三)|DM数据库DBMS_WORKLOAD_REPOSITORY 包及其性能分析工具AWR

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、达梦数据库产品及解决方案&#xff0c;点击前往 2、达梦技术文档&#xff0c;点击前往 3、武汉达梦数据库有限公司 官网首页&#xff0c;点击前往 1、本文内容全部…

【软考备战·希赛网每日一练】2023年4月10日

文章目录一、今日成绩二、错题总结第一题第二题三、知识查缺题目及解析来源&#xff1a;2023年04月10日软件设计师每日一练 一、今日成绩 二、错题总结 第一题 解析&#xff1a; 本题属于专业英语&#xff0c;大体了解意思即可。 题目大意&#xff1a; 第二题 解析&#xff1a…

ORACLE创建表空间、用户、授权和Navicat创建序列和触发器及解决ORA-00942、ORA-01219错误

问题描述&#xff1a;因为每次Oracle删除数据库的时候磁盘文件还没删除&#xff0c;然后自己手动停止Oracle&#xff0c;删除磁盘里的.DBF文件导致数据库重启后无法连接。 cmd sqlplus sys as sysdba执行alter database open;查看你报错的数据文件&#xff08;就是你停止Orac…

ESP32 分区表

ESP32 分区表 1. 分区表概述 ESP32 针对 flash 进行划分&#xff0c;划分为不同的区域用作不同的功能&#xff0c;并在flash的 0x8000 位置处烧写了一张分区表用来描述分区信息。 分区表可以根据自己的需要进行配置&#xff0c;每一个分区都有其特定的作用&#xff0c;可根据…

Jetpack Compose之选择器

选择器是啥 选择器主要是指Checkbox复选框&#xff0c;单选开关Switch,滑杆组件Slider等用于提供给用户选择一些值和程序交互的组件&#xff0c;比如像复选框Checkbox&#xff0c;可以让用户选择一个或者多个选项&#xff0c;它可以将一个选项打开或者是关闭&#xff0c;通常用…

【JavaEE】ConcurrentHashMap与Hashtable有什么区别?

博主简介&#xff1a;努力的打工人一枚博主主页&#xff1a;xyk:所属专栏: JavaEE初阶Hashtable、ConcurrentHashMap是使用频率较高的数据结构&#xff0c;它们都是以key-value的形式来存储数据&#xff0c;且都实现了Map接口&#xff0c;日常开发中很多人对其二者之间的区别并…

STM32F4_窗口看门狗精讲(WWDG)

目录 1. 窗口看门狗WWDG简介 2. 窗口看门狗和独立看门狗的区别 3. WWDG主要特性 4. WWDG功能 4.1 窗口看门狗框图(重要) 4.2 看门狗超时计算 5. WWDG寄存器 5.1 控制寄存器 WWDG_CR 5.2 配置寄存器 WWDG_CFR 5.3 状态寄存器 WWDG_SR 6 库函数配置窗口看门狗(采用中断…

Mybatis(五)------Mybatis执行Mapper接口的方法流程

前面几篇文章我们介绍了JDBC、Mybatis的工具类等&#xff0c;下面我们开始对于mybatis的各个机制开始解析。 前面我们知道&#xff0c;mybatis对excutor进行封装成sqlsession提供给开发人员进行数据库的增删改查&#xff0c;我们先从Mybatis最顶层的API入手。 SQLSession的创…

爬虫日常练习-艾图网单页面图片爬取

文章目录爬虫练习分析网站代码设计下载图片完整代码爬虫练习 hello&#xff0c;大家好。好久不见了&#xff0c;无聊的网友今天开始更新关于爬虫的一些日常练习。每次学习完一个新的知识后没有多的案例给自己练习真的很不舒服&#xff0c;希望该系列文章能够让刚刚开始学习爬虫…

常见面试题之Redis篇

1.1.Redis与Memcache的区别&#xff1f; redis支持更丰富的数据类型&#xff08;支持更复杂的应用场景&#xff09;&#xff1a;Redis不仅仅支持简单的k/v类型的数据&#xff0c;同时还提供list&#xff0c;set&#xff0c;zset&#xff0c;hash等数据结构的存储。memcache支持…

腾讯云CVM云服务器评测:标准型S5、S6

一、腾讯云CVM云服务器评测&#xff1a;标准型S5、S6 腾讯云服务器CVM标准型S5是次新一代云服务器规格&#xff0c;标准型S6是最新一代的云服务器&#xff0c;S6实例的CPU处理器主频性能要高于S5实例&#xff0c;同CPU内存配置下的标准型S6实例要比S5实例性能更好一些&#xf…