– 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)
//set 必须传一个参数
//get 必须有返回值
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)
- 删除哪个对象中的哪个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++
- JavaScript的第七种数据类型,是一种基本数据类型
- 在一次关于JavaScript对象私有属性的一次提案上提出的Symbol这个词,私有属性这个提案并没有通过,但是Symbol留下来了,它就是用来给对象设置(类似于)私有属性
- 任何两个Symbol都是不相等的
- Object.getOwnPropertySymbol(obj)
- 获取本身的所有Symbol属性
- 用法
let obj = { a:12 } obj[Symbol('a')] = function () { } obj[Symbol('a')] = 123 console.log(obj) //{a:12, Symbol(a):123, Symbol(a):f} 复制代码
- 如何获取
Object.getOwnPropertySymbol(obj)
//(2)[Symbol(a),Symbol(a)]
复制代码
- 如何拿Symbol的值
通过变量声明
let a = Symbol('a');
let b = Symbol('b');
let obj = {
a:12
}
obj[a] = function () {
}
obj[b] = 123;
console.log(obj[a]) // f () {}
console.log(obj[b]) // 123
console.log(obj.a) // 12
//通过遍历
Object.getOwnPropertySymbol(obj).forEach(item => {
console.log(obj[item])
//f(){} 123
})
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END