ES6对象扩展

ES6对象扩展

属性表示

ES6 允许在对象之中,直接写变量。这时,属性名为变量名, 属性值为变量的值。

属性名表达式

表达式作为属性名要写在方括号中。

如果属性名表达式是一个对象,会转为字符串[object Object]

[keyA][keyB]得到的都是[object Object],所以[keyB]会把[keyA]覆盖掉,而myObject最后只有一个[object Object]属性。

Object.is()

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

不同之处:

Object.assign()

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

同名的情况下,后者覆盖前者。

首参不能为undefinednull,两者不能转换成对象。在其他位置,会给自动忽略掉。 数值和布尔值都会被忽略,字符串会以数组形式传入。

注意:

Object.assign()是浅拷贝,原对象改变,它也会改变。

属性描述符

属性描述符有两种主要形式:数据描述符存取描述符

  • 数据描述符是一个拥有可写或不可写值的属性。

  • 存取描述符是由一对 getter-setter 函数功能来描述的属性。

描述符必须是两种形式之一,不能同时是两者。

数据描述符

下列的属性在Object.defineProperty中默认为false,但在基本的对象数据结构中,下列属性默认为true

  • configurable

是否可以删除目标属性或是否可以再次修改属性的特性(writable, configurable, enumerable)。默认为 false

  • enumerable

此属性是否可以被枚举(使用for...inObject.keys())。设置为true可以被枚举;设置为false,不能被枚举。默认为false

  • writable

属性的值是否可以被重写。设置为true可以被重写;设置为false,不能被重写。默认为false

  • value

属性对应的值,可以使任意类型的值,默认为undefined

查看设置:

ES5有三个操作会忽略enumerablefalse的属性。

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

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

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

ES6新增了一个操作Object.assign(),会忽略enumerablefalse的属性,只拷贝对象自身的可枚举的属性。

toStringlength属性的enumerable都是false,因此for...in不会遍历到这两个继承自原型的属性。

存取器描述

当使用存取器描述属性的特性的时候,允许设置以下特性属性:

当使用了getter或setter方法,不允许使用writable和value这两个属性

  • getter 是一种获得属性值的方法

  • setter是一种设置属性值的方法。

参考:

https://segmentfault.com/a/1190000007434923 https://developer.mozilla.org/cn/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

属性的遍历

  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或字符串,也不管是否可枚举。

__proto__属性

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

Object.defineProperty()

Object.defineProperty()方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。

Object.setPrototypeOf()

Object.setPrototypeOf方法的作用与__proto__相同,用来设置一个对象的prototype对象。

Object.getPrototypeOf()

该方法与setPrototypeOf方法配套,用于读取一个对象的prototype对象。

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

Object.keys

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

Object.values

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

Object.entries

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

对象的扩展运算符

解构赋值

对象的解构赋值用于从一个对象取值,相当于将所有可遍历的、但尚未被读取的属性,分配到指定的对象上面。所有的键和它们的值,都会拷贝到新对象上面。

上面代码中,变量z是解构赋值所在的对象。它获取等号右边的所有尚未读取的键(ab),将它们连同值一起拷贝过来。

扩展运算符

扩展运算符(...)用于取出参数对象的所有可遍历属性,拷贝到当前对象之中。

这等同于使用Object.assign方法。

Object.getOwnPropertyDescriptor()

返回某个对象属性的描述对象(descriptor)。

参考:http://es6.ruanyifeng.com/?search=import&x=15&y=8#docs/object

Object.create(prototype, descriptors)

创建一个具有指定原型且可选择性地包含指定属性的对象。

  • prototype

    • 必需。 要用作原型的对象。 可以为 null。

  • descriptors

    • 可选。 包含一个或多个属性描述符的 JavaScript 对象。

JS原型和原型链

每个构造函数生成实例的时候 会自带一个constructor属性 指向该构造函数

每个构造函数都有一个prototype属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。

JS在创建对象(不论是普通对象还是函数对象)的时候,都有一个叫做__proto__的内置属性,用于指向创建它的函数对象的原型对象prototype

同样,Cat.prototype对象也有__proto__属性,它指向创建它的函数对象(Object)的prototype

继续,Object.prototype对象也有__proto__属性,但它比较特殊,为null

我们把这个有__proto__串起来的直到Object.prototype.__proto__null的链叫做原型链

参考

Last updated

Was this helpful?