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
Was this helpful?