【学习笔记】js 对象操作方法

一 .属性的操作

判断对象是否具有该属性

1.Object.prototype.hasOwnProperty()

返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是是否有指定的键)

2.Reflect.has(target, propertyKey)

返回一个布尔值,用于检查一个对象是否拥有某个属性, 相当于in 操作符 。如果目标对象并非Object 类型,抛出TypeError。

返回对象属性的操作

1.Object.getOwnPropertyDescriptor()

返回对象指定的属性配置。

2.Object.getOwnPropertyNames()

返回一个数组,它包含了指定对象所有的可枚举或不可枚举的属性名。

3.Object.getOwnPropertySymbols()

返回一个数组,它包含了指定对象自身所有的符号属性。

4.Object.keys()

返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键名。

5.Object.entries()

返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值对数组。

6.Reflect.ownKeys(obj)

返回一个数组,包含对象自身的所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举。

7.Reflect.get(target, name, receiver)

查找并返回target对象的name属性,如果没有该属性,则返回undefined。

8.Reflect.getOwnPropertyDescriptor(target, propertyKey)

基本等同于Object.getOwnPropertyDescriptor,用于得到指定属性的描述对象,将来会替代掉后者。个区别是,如果第一个参数不是对象,Object.getOwnPropertyDescriptor(1, ‘foo’)不报错,返回undefined,而Reflect.getOwnPropertyDescriptor(1, ‘foo’)会抛出错误,表示参数非法。

遍历对象的属性

1.for…in

for…in循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)。

2.Object.keys(obj)

Object.keys返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名。

3.Object.getOwnPropertyNames(obj)

Object.getOwnPropertyNames返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名。

4.Object.getOwnPropertySymbols(obj)

Object.getOwnPropertySymbols返回一个数组,包含对象自身的所有 Symbol 属性的键名。

5.Reflect.ownKeys(obj)

Reflect.ownKeys返回一个数组,包含对象自身的所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举。
基本等同于Object.getOwnPropertyNames与Object.getOwnPropertySymbols之和。
如果Reflect.ownKeys()方法的第一个参数不是对象,会报错。

以上的 5 种方法遍历对象的键名,都遵守同样的属性遍历的次序规则。

首先遍历所有数值键,按照数值升序排列。
其次遍历所有字符串键,按照加入时间升序排列。
最后遍历所有 Symbol 键,按照加入时间升序排列。

添加新属性,或修改现有属性

1.Object.defineProperty()

给对象添加一个属性并指定该属性的配置。

2.Reflect.defineProperty(target, propertyKey, attributes)

基本等同于Object.defineProperty,用来为对象定义属性。未来,后者会被逐渐废除,请从现在开始就使用Reflect.defineProperty代替它。如果Reflect.defineProperty的第一个参数不是对象,就会抛出错误

3.Object.defineProperties()

给对象添加多个属性并分别指定它们的配置。

3.Reflect.set(target, name, value, receiver)

设置target对象的name属性等于value。如果name属性设置了赋值函数,则赋值函数的this绑定receiver。

复制对象的属性

1.Object.assign()

用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。

删除对象的属性

1.Reflect.deleteProperty(target, propertyKey)

删除一个对象上的属性并返回一个布尔值,表明该属性是否被成功删除。如果target不是 Object,会抛出一个 TypeError。

二.原型对象的操作

返回对象的原型对象

1.Object.getPrototypeOf()

  • 返回指定对象的原型对象。

2.Reflect.getPrototypeOf(obj)

用于读取对象的__proto__属性,对应Object.getPrototypeOf(obj)。他们的一个区别是,如果参数不是对象,Object.getPrototypeOf会将这个参数转为对象,然后再运行,而Reflect.getPrototypeOf会报错。

给对象指定其原型对象

3.Object.setPrototypeOf()

设置对象的原型(即内部 [[Prototype]] 属性)。用于设置目标对象的原型(prototype)

4.Reflect.setPrototypeOf(obj, newProto)

设置对象的原型(即内部 [[Prototype]] 属性)。用于设置目标对象的原型(prototype),对应Object.setPrototypeOf(obj, newProto)方法。它返回一个布尔值,表示是否设置成功。
如果无法设置目标对象的原型(比如,目标对象禁止扩展),Reflect.setPrototypeOf方法返回false。
如果第一个参数不是对象,Object.setPrototypeOf会返回第一个参数本身,而Reflect.setPrototypeOf会报错。
如果第一个参数是undefined或null,Object.setPrototypeOf和Reflect.setPrototypeOf都会报错。

三.属性值的操作

比较属性值

1.Object.is()

用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致。

返回属性值

5.Object.values()

返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值。

四.判断对象的操作

1.Object.isExtensible()

判断一个对象是否是可扩展的(是否可以在它上面添加新的属性)。

2.Object.isFrozen()

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

3.Object.isSealed()

判断一个对象是否被密封。

4.Reflect.isExtensible (target)

对应Object.isExtensible,返回一个布尔值,表示当前对象是否可扩展。如果参数不是对象,Object.isExtensible会返回false,因为非对象本来就是不可扩展的,而Reflect.isExtensible会报错。

五.创建对象的操作

1.Object.assign()

通过复制一个或多个对象来创建一个新的对象。

2.Object.create()

使用指定的原型对象和属性创建一个新对象。

3.new 运算符

创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。
new 关键字会进行如下的操作:

1创建一个空的简单JavaScript对象(即{});
2链接该对象(即设置该对象的构造函数)到另一个对象 ;
3将步骤1新创建的对象作为this的上下文 ;
4如果该函数没有返回对象,则返回this。

4.Reflect.construct(target, args)

等同于new target(…args),这提供了一种不使用new,来调用构造函数的方法。如果Reflect.construct()方法的第一个参数不是函数,会报错。

六.让对象不可扩展

1.Object.preventExtensions()

用于让一个对象变为不可扩展。它返回一个布尔值,表示是否操作成功。

2.Reflect.preventExtensions(target)

对应Object.preventExtensions方法,用于让一个对象变为不可扩展。它返回一个布尔值,表示是否操作成功。
如果参数不是对象,Object.preventExtensions在 ES5 环境报错,在 ES6 环境返回传入的参数,而Reflect.preventExtensions会报错。

七.Reflect概述

Reflect对象与Proxy对象一样,也是ES6为了操作对象而提供的新API。
设计目的

  • 1.将Object对象的一些明显属于语言内部的方法(比如Object.defineProperty)放到Relfect对象上。现阶段,某些方法同时在Object和Reflect对象上部署,未来的新方法将只部署在Reflect对象上。也就是说,从Reflect对象上可以拿到语言内部的方法。

  • 2.修改某些Object方法的返回结果,让其变得更合理。

  • 3.让ObjectX操作都变成函数行为。某些Object操作是命令模式,比如name in obj 和delete obj[name],而Reflect.has(obj,name)和Reflect.deleteProperty(obj,name)让他们变成了函数行为。

  • 4.Reflect对象的方法与Proxy对象的方法一一对应,只要有Proxy对象的方法,就能在Reflect对象上找到对应的方法。这就让Proxy对象可以方便的调用对应的Reflect方法,完成默认行为,作为修改行为的基础。也就是说,不管Proxy怎么修改默认行为,你总可以在Reflect上获取默认行为。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值