ES6对象扩展
ES6对象扩展
属性表示
ES6 允许在对象之中,直接写变量。这时,属性名为变量名, 属性值为变量的值。
属性名表达式
表达式作为属性名要写在方括号中。
如果属性名表达式是一个对象,会转为字符串[object Object]
。
[keyA]
和[keyB]
得到的都是[object Object]
,所以[keyB]
会把[keyA]
覆盖掉,而myObject
最后只有一个[object Object]
属性。
Object.is()
它用来比较两个值是否严格相等,与严格比较运算符(===
)的行为基本一致。
不同之处:
Object.assign()
Object.assign
方法用于对象的合并,将源对象(source
)的所有可枚举属性,复制到目标对象(target
)。
同名的情况下,后者覆盖前者。
首参不能为undefined
或null
,两者不能转换成对象。在其他位置,会给自动忽略掉。 数值和布尔值都会被忽略,字符串会以数组形式传入。
注意:
Object.assign()
是浅拷贝,原对象改变,它也会改变。
属性描述符
属性描述符有两种主要形式:数据描述符
和存取描述符
。
数据描述符
是一个拥有可写或不可写值的属性。存取描述符
是由一对getter-setter
函数功能来描述的属性。
描述符必须是两种形式之一
,不能同时是两者。
数据描述符
下列的属性在Object.defineProperty
中默认为false
,但在基本的对象数据结构中,下列属性默认为true
。
configurable
是否可以删除目标属性或是否可以再次修改属性的特性(writable
, configurable
, enumerable
)。默认为 false。
enumerable
此属性是否可以被枚举(使用for...in
或Object.keys()
)。设置为true
可以被枚举;设置为false
,不能被枚举。默认为false。
writable
属性的值是否可以被重写。设置为true
可以被重写;设置为false
,不能被重写。默认为false。
value
属性对应的值,可以使任意类型的值,默认为undefined。
查看设置:
ES5有三个操作会忽略enumerable
为false
的属性。
for...in循环:只遍历对象自身的和继承的可枚举的属性
Object.keys():返回对象自身的所有可枚举的属性的键名
JSON.stringify():只串行化对象自身的可枚举的属性
ES6新增了一个操作Object.assign()
,会忽略enumerable
为false
的属性,只拷贝对象自身的可枚举的属性。
toString
和length
属性的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
属性的遍历
for...in
for...in
循环遍历对象自身的和继承的可枚举属性(不含Symbol属性)。
Object.keys(obj)
Object.keys
返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含Symbol属性)。
Object.getOwnPropertyNames(obj)
Object.getOwnPropertyNames
返回一个数组,包含对象自身的所有属性(不含Symbol属性,但是包括不可枚举属性)。
Object.getOwnPropertySymbols(obj)
Object.getOwnPropertySymbols
返回一个数组,包含对象自身的所有Symbol属性。
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
是解构赋值所在的对象。它获取等号右边的所有尚未读取的键(a
和b
),将它们连同值一起拷贝过来。
扩展运算符
扩展运算符(...
)用于取出参数对象的所有可遍历属性,拷贝到当前对象之中。
这等同于使用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