- Es6 - Object
怎么去实例化
- 通过new 过程有三歩
- 第一步创建一个新对象
- 第二步让这个对象的原型等于函数的原型,意味着这个对象的原型上就有函数原型上的方法和属性了
- 第三步 让这个函数的this去指向对象,也就是说对象本身上面就有了函数实例本身的一些属性和方法了
- Es6新增的Reflect上的construct的方法也可以对一个构造函数实例化,它的第一个参数是构造函数,第二个参数是一个数组,对构造函数进行传参的,Reflect是专门用来操作对象的API,它把对象上面的一些方法移植到了它上面,包括一些delete删除对象key的方法等,把它都变成了一个函数式行为了。
对象添加key
- [key] : value;
- []中可以写表达式;
- []中可以写自执行函数
let key = 5;
let obj = {
a:1,
b:2
[key]:3,
[true ? 'a' : 'b'],
[(function(){return 'aaaa')()] : 5
}
存取器 (get/set)
let obj = {
age : 10,
set age (val) {
if(val === 1) {
throw Error ('该属性不可设置')
}
},
get age () {
return 123
}
}
++Reflect++
为操作对象而提供的新API
为什么设计Reflect?
- 将Object对象的属于语言内部的方法放在Reflect对象上,即从Reflect对象上拿Object对象内部方法,把Object和他上面的方法分离开来,放在Reflect上。
defineProperty
Object.defineProperty(targer,property,attributes)
Reflect.defineProperty(targer,property,attributes)
//返回一个布尔值 true/false
in方法
Object.hasOwnProperty()
for in
- 不仅遍历它本身,还会遍历它的原型链
- 拿到所有的可枚举属性,包括原型和原型链上的
Reflect.has(obj,key)
- 返回一个布尔值 true/false
- 检测Obj中有没有key
- 第一个值是对象
- 第二个值是key
Reflect.delectProperty(obj,key)
Reflect.construct(target, [args])
- Es6 的实例化 函数式的操作
- 之前是通过new 来实例化的
- 第一个参数是 构造函数
- 第二个参数是 传参 必须是一个数组
Reflect.apply(fn, obj, [])
- 第一个参数 改变谁的this指向
- 第二个参数 指向谁
- 第三个参数 传的参数 必须传,不传参也得传一个空数组[ ]
Reflect.getPrototypeOf(obj)
- 返回一个对象
- 获取原型的,读取对象的proto属性
- 对应Object.getPrototypeOf(obj)
Reflect.setPrototypeOf(obj,{key:value})
- 设置原型的(prototype)
- 第二个参数 是原型上设置什么
Reflect.ownKeys (obj)
- 获取返回对象的属性
- 仅获取到本身的可枚举和不可枚举不包括原型或者原型链上的属性
Object.keys/Reflect.ownKeys/for in 区别
- for in 可拿到可枚举的对象本身、原型、原型链上的全部属性
- Object.keys 仅可以获取对象本身的可枚举属性
- Reflect.ownKeys 仅属于Reflect,可以获取到对象本身的可枚举、不可枚举的所有的属性,不包括原型和原型链上的属性
优化for in
for(let key in obj ){
console.log(key)
}
Object.keys(obj).forEach(item => {
console.log(item)
})
Reflect.getOwnPropertyDescriptor(obj, key)
- 基本等同于Object.getOwnPropertyDescriptor,
- 用于得到指定属性的描述对象(是否可读可写可操作)
Reflect.preventExtensions(obj)
- 对应Object.preventExtensions方法
- 还有Es5的Objject.freeze(obj) ,效果一样
- 用于让一个对象变为不可扩展。它返回一个布尔值,表示是否操作成功
Reflect.isExtensible (obj)
++Object++
Object.is(a,b)
- 对两个值的一个比较,接收两个参数
- 返回一个布尔值
- Es6中两个NaN是相等的
Object.keys(key)
Object.getOwnPropertyNames(obj)
++Symbol++
Object.getOwnPropertySymbol(obj)
//(2)[Symbol(a),Symbol(a)]
let a = Symbol('a');
let b = Symbol('b');
let obj = {
a:12
}
obj[a] = function () {
}
obj[b] = 123;
console.log(obj[a])
console.log(obj[b])
console.log(obj.a)
Object.getOwnPropertySymbol(obj).forEach(item => {
console.log(obj[item])
})