前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >对象的扩展

对象的扩展

原创
作者头像
李才哥
修改2021-02-23 14:32:00
6960
修改2021-02-23 14:32:00
举报
文章被收录于专栏:李才哥李才哥

对象的扩展

属性的简洁表示法

ES6 允许直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁。

属性名表达式

JavaScript 定义对象的属性,有两种方法

方法一是直接用标识符作为属性名,方法二是用表达式作为属性名,这时要将表达式放在方括号之内

注意,属性名表达式如果是一个对象,默认情况下会自动将对象转为字符串[object Object]

方法的 name 属性

函数的name属性,返回函数名。对象方法也是函数,因此也有name属性

如果对象的方法使用了取值函数(getter)和存值函数(setter),则name属性不是在该方法上面,而是该方法的属性的描述对象的get和set属性上面,返回值是方法名前加上get和set

bind方法创造的函数,name属性返回bound加上原函数的名字;

Function构造函数创造的函数,name属性返回anonymous

如果对象的方法是一个 Symbol 值,那么name属性返回的是这个 Symbol 值的描述

Object.is()

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

不同之处只有两个:一是+0不等于-0,二是NaN等于自身

Object.assign()

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

如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性

如果非对象参数出现在源对象的位置(即非首参数),那么处理规则有所不同。首先,这些参数都会转成对象,如果无法转成对象,就会跳过

这意味着,如果undefined和null不在首参数,就不会报错

Object.assign拷贝的属性是有限制的,只拷贝源对象的自身属性(不拷贝继承属性),也不拷贝不可枚举的属性(enumerable: false)

Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用

浅拷贝

遇到同名属性,Object.assign的处理方法是替换,而不是添加

Object.assign可以用来处理数组,但是会把数组视为对象

Object.assign只能进行值的复制,如果要复制的值是一个取值函数,那么将求值后再复制

为对象添加属性

为对象添加方法

克隆对象

合并多个对象

为属性指定默认值

属性的可枚举性和遍历

对象的每个属性都有一个描述对象(Descriptor),用来控制该属性的行为

Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象

for...in循环:只遍历对象自身的和继承的可枚举的属性。

Object.keys():返回对象自身的所有可枚举的属性的键名。

JSON.stringify():只串行化对象自身的可枚举的属性。

Object.assign(): 忽略enumerable为false的属性,只拷贝对象自身的可枚举的属性

引入“可枚举”(enumerable)这个概念的最初目的,就是让某些属性可以规避掉for...in操作,不然所有内部属性和方法都会被遍历到

属性的遍历

for...in

Object.keys(obj)

Object.getOwnPropertyNames(obj)

Object.getOwnPropertySymbols(obj)

Reflect.ownKeys(obj)

首先遍历所有数值键,按照数值升序排列。

其次遍历所有字符串键,按照加入时间升序排列。

最后遍历所有 Symbol 键,按照加入时间升序排列。

Object.getOwnPropertyDescriptors()

ES2017 引入了Object.getOwnPropertyDescriptors方法,返回指定对象所有自身属性(非继承属性)的描述对象

该方法的引入目的,主要是为了解决Object.assign()无法正确拷贝get属性和set属性的问题

__proto__属性,Object.setPrototypeOf(),Object.getPrototypeOf()

ES6 规定__proto__只有浏览器要部署,其他环境不用部署

__proto__属性(前后各两个下划线),用来读取或设置当前对象的prototype对象

Object.setPrototypeOf方法的作用与__proto__相同,用来设置一个对象的prototype对象,返回参数对象本身

该方法与Object.setPrototypeOf方法配套,用于读取一个对象的原型对象

super 关键字

ES6 又新增了另一个类似的关键字super,指向当前对象的原型对象

super关键字表示原型对象时,只能用在对象的方法之中,用在其他地方都会报错

Object.keys(),Object.values(),Object.entries()

ES5 引入了Object.keys方法,返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键名

ES2017 引入了跟Object.keys配套的Object.values和Object.entries,作为遍历一个对象的补充手段,供for...of循环使用

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

返回数组的成员顺序

Object.values会过滤属性名为 Symbol 值的属性

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

对象的扩展运算符

运算符(...)ES2018 将这个运算符引入了对象

对象的解构赋值用于从一个对象取值,相当于将目标对象自身的所有可遍历的(enumerable)、但尚未被读取的属性,分配到指定的对象上面

由于解构赋值要求等号右边是一个对象,所以如果等号右边是undefined或null,就会报错,因为它们无法转为对象

解构赋值必须是最后一个参数,否则会报错

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 属性的简洁表示法
    • ES6 允许直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁。
    • 属性名表达式
      • JavaScript 定义对象的属性,有两种方法
        • 方法一是直接用标识符作为属性名,方法二是用表达式作为属性名,这时要将表达式放在方括号之内
          • 注意,属性名表达式如果是一个对象,默认情况下会自动将对象转为字符串[object Object]
          • 方法的 name 属性
            • 函数的name属性,返回函数名。对象方法也是函数,因此也有name属性
              • 如果对象的方法使用了取值函数(getter)和存值函数(setter),则name属性不是在该方法上面,而是该方法的属性的描述对象的get和set属性上面,返回值是方法名前加上get和set
                • bind方法创造的函数,name属性返回bound加上原函数的名字;
                  • Function构造函数创造的函数,name属性返回anonymous
                    • 如果对象的方法是一个 Symbol 值,那么name属性返回的是这个 Symbol 值的描述
                    • Object.is()
                      • 用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致
                        • 不同之处只有两个:一是+0不等于-0,二是NaN等于自身
                        • Object.assign()
                          • Object.assign方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)
                            • 如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性
                              • 如果非对象参数出现在源对象的位置(即非首参数),那么处理规则有所不同。首先,这些参数都会转成对象,如果无法转成对象,就会跳过
                                • 这意味着,如果undefined和null不在首参数,就不会报错
                                  • Object.assign拷贝的属性是有限制的,只拷贝源对象的自身属性(不拷贝继承属性),也不拷贝不可枚举的属性(enumerable: false)
                                    • Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用
                                      • 遇到同名属性,Object.assign的处理方法是替换,而不是添加
                                        • Object.assign可以用来处理数组,但是会把数组视为对象
                                          • Object.assign只能进行值的复制,如果要复制的值是一个取值函数,那么将求值后再复制
                                            • 为对象添加属性
                                              • 为对象添加方法
                                                • 克隆对象
                                                  • 合并多个对象
                                                    • 为属性指定默认值
                                                    • 属性的可枚举性和遍历
                                                      • 对象的每个属性都有一个描述对象(Descriptor),用来控制该属性的行为
                                                        • Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象
                                                          • for...in循环:只遍历对象自身的和继承的可枚举的属性。
                                                            • Object.keys():返回对象自身的所有可枚举的属性的键名。
                                                              • JSON.stringify():只串行化对象自身的可枚举的属性。
                                                                • Object.assign(): 忽略enumerable为false的属性,只拷贝对象自身的可枚举的属性
                                                                  • 引入“可枚举”(enumerable)这个概念的最初目的,就是让某些属性可以规避掉for...in操作,不然所有内部属性和方法都会被遍历到
                                                                    • 属性的遍历
                                                                      • for...in
                                                                      • Object.keys(obj)
                                                                      • Object.getOwnPropertyNames(obj)
                                                                      • Object.getOwnPropertySymbols(obj)
                                                                      • Reflect.ownKeys(obj)
                                                                      • 首先遍历所有数值键,按照数值升序排列。
                                                                      • 其次遍历所有字符串键,按照加入时间升序排列。
                                                                      • 最后遍历所有 Symbol 键,按照加入时间升序排列。
                                                                  • Object.getOwnPropertyDescriptors()
                                                                    • ES2017 引入了Object.getOwnPropertyDescriptors方法,返回指定对象所有自身属性(非继承属性)的描述对象
                                                                      • 该方法的引入目的,主要是为了解决Object.assign()无法正确拷贝get属性和set属性的问题
                                                                      • __proto__属性,Object.setPrototypeOf(),Object.getPrototypeOf()
                                                                        • ES6 规定__proto__只有浏览器要部署,其他环境不用部署
                                                                          • __proto__属性(前后各两个下划线),用来读取或设置当前对象的prototype对象
                                                                            • Object.setPrototypeOf方法的作用与__proto__相同,用来设置一个对象的prototype对象,返回参数对象本身
                                                                              • 该方法与Object.setPrototypeOf方法配套,用于读取一个对象的原型对象
                                                                              • super 关键字
                                                                                • ES6 又新增了另一个类似的关键字super,指向当前对象的原型对象
                                                                                  • super关键字表示原型对象时,只能用在对象的方法之中,用在其他地方都会报错
                                                                                  • Object.keys(),Object.values(),Object.entries()
                                                                                    • ES5 引入了Object.keys方法,返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键名
                                                                                      • ES2017 引入了跟Object.keys配套的Object.values和Object.entries,作为遍历一个对象的补充手段,供for...of循环使用
                                                                                        • Object.values方法返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值
                                                                                          • 返回数组的成员顺序
                                                                                            • Object.values会过滤属性名为 Symbol 值的属性
                                                                                              • Object.entries方法返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值对数组
                                                                                              • 对象的扩展运算符
                                                                                                • 运算符(...)ES2018 将这个运算符引入了对象
                                                                                                  • 对象的解构赋值用于从一个对象取值,相当于将目标对象自身的所有可遍历的(enumerable)、但尚未被读取的属性,分配到指定的对象上面
                                                                                                    • 由于解构赋值要求等号右边是一个对象,所以如果等号右边是undefined或null,就会报错,因为它们无法转为对象
                                                                                                      • 解构赋值必须是最后一个参数,否则会报错
                                                                                                      领券
                                                                                                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档