Es6 – Object、Symbol 记录 – 3

– 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
喜欢就支持一下吧
点赞0 分享