Object的常用方法-属性描述符


-------- | -----
电脑  | $1600`
		//照着下面的代码敲一遍就能熟悉各个方法的使用了
		//知识点密度高,需要放慢速度来理解记忆
		//涉及十种Object方法, 分别如下
        //Object.getOwnPropertyDescriptor(obj,prop)
        //Object.getOwnPropertyDescriptors(obj)
        //Object.defineProperty(obj,prop,{descriptor})
        //Object.defineProperties(obj,{prop1:{descriptor},prop2:{descriptor}})
        //Object.keys(obj) 返回值 属性名构成的数组
        //Object.values(obj) 返回值 属性值构成的数组
        //Object.entries(obj) 返回值 键值对构成的二维数组
        //Object.assign(o1,o2,o3) 对象复制、浅拷贝,不枚举属性丢失、源对象原型丢失、属性描述符丢失
        //Object.create(prototype,{prop1:{descriptor},prop2:{descriptor}})
        //浅拷贝对象Object.create(Object.getPrototypeOf(obj),Object.getOwnPropertyDescriptors(obj))
        //Object.getPrototypeOf(obj)
        
        //Object.getOwnPropertyDescriptor(obj,prop)
        //Object.defineProperty(obj,prop,options) 数据/访问的options默认为false
        //obj.prop = value 默认options为true
        //obj = {prop1:value1,prop2:value2} 默认options为true 
        //数据属性 options{value,writable,enumerable,configurable}
        //访问属性 options{enumerable,configurable,get,set}
        //for (key in obj) {console.log(key,obj[key])}
        //Object.keys(obj) 返回值 属性名组成的数组
        //Object.values(obj) 返回值 属性值组成的数组
        //Object.entries(obj) 返回值 键值对组成的二维数组
        //Object.defineProperties(obj,{prop1:{descriptor},prop2:{descriptor}})
        //Object.getOwnPropertyDescriptors(obj) 得到所有属性的描述符
        let person = {
            name:'zhangsan',
            age:23
        }
        console.log(Object.getOwnPropertyDescriptor(person,'name'))
        person.name = 'modified wangwu'
        for (let key in person) {
            console.log(key,person[key])
        }
        delete person.name
        console.log(person)
        Object.defineProperty(person,'age',{
            value:20,
            writable: false,
            enumerable:false,
            configurable:false
        })
        console.log(Object.getOwnPropertyDescriptor(person,'age'))

        var book = {
            _year: 2017,
            editor: 1
        };
        Object.defineProperty(book,'year',{
            get:function () {
                return this._year;
            },
            set: function(newYear) {
                if (newYear !== this._year) {
                    this._year = newYear;
                    this.editor++;
                }
            }
        })
        console.log(Object.getOwnPropertyDescriptor(book,'year'))
        book.year = 2018
        for (let key in book) {
            console.log(key,book[key])
        }
        console.log(Object.keys(book))
        console.log(Object.values(book))
        Object.defineProperty(book,'author',{
            value:'hu',
            // writable:true,
            // enumerable:true,
            // configurablle:true
        })
        console.log(Object.getOwnPropertyDescriptor(book,'author'))
        // book.author = 'hu'
        console.log(Object.entries(book))

        let person1 = {
            name:'tom'
        }
        console.log('-------')
        console.log(Object.getOwnPropertyDescriptor(person1,'name'))
        Object.defineProperty(person1,'age',{
            value:26,
            writable:true,
            enumerable:true,
            configurable:true
        })
        console.log(Object.entries(person1))

        let person2 = {
            _name:'zhaoyi',
            _age:22,
            _tel:123
        }
        Object.defineProperty(person2,'name',{
            get:function() {
                return this._name;
            }
        })
        Object.defineProperty(person2,'age',{
            set:function(newAge) {
                this._age = newAge
            }
        })
        Object.defineProperty(person2,'tel',{
            get:function() {
                return this._tel;
            },
            set:function(newTel) {
                this._tel = newTel
            }
        })
        console.log('-------')
        console.log(person2.name)
        console.log(person2.age)
        person2.age = 25
        console.log(person2._age)
        person2.tel = '456798'
        console.log(person2.tel)

        console.log('--------')
        let person3 = {
            _name:'wang mazi',
            _age: 56,
            _tel: 1111
        }
        Object.defineProperties(person3,{
            name:{
                get:function() {return this._name}
            },
            age:{
                set:function(newAge) {
                    this._age = newAge
                }
            },
            tel: {
                get:function() {return this._tel},
                set:function(newTel) {
                    this._tel = newTel;
                }
            }
        })

        console.log(Object.getOwnPropertyDescriptors(person3))

        //浅拷贝一个对象
        let obj = {}
        let obj3 = Object.defineProperties(obj,{
            _year: {
                value: 2021,
                writable: true,
                enumerable: true,
                configurable:false
            },
            _month: {
                value:07,
                writable: false,
                enumerable: true,
                configurable: true
            },
            year: {
                enumerable: false,
                configurable: true,
                get: function() {return this._year}
            },
            month: {
                enumerable: true,
                get: function() {return this._month},
                set: function(newMonth) {
                    this._month = newMonth
                }
            }
        })
        let obj1 = {}
        obj1.__proto__ = {p:'obj1 prototype'}
        Object.assign(obj1,obj)
        console.log(obj1)
        //浅拷贝一个对象Object.assign()
        //适合没有属性描述符、及instanceof 类型相同的对象合并
        //访问器属性变为数据属性
        //只能copy可枚举属性
        //无法copy属性描述符
        //无法拷贝源对象的原型  obj.__proto__ = Object.prototype
        console.log(Object.getOwnPropertyDescriptors(obj),'obj')
        console.log(Object.getOwnPropertyDescriptors(obj1),'obj1')
        console.log(obj.__proto__)
        console.log(obj1.__proto__)
        //浅拷贝一个对象 
        //Object.create(Object.getPrototypeOf(obj),Object.getOwnPropertyDescriptors(obj))
        //得到对象的原型,得到对象的属性、属性描述符
        let obj2 = Object.create(
            Object.getPrototypeOf(obj),
            Object.getOwnPropertyDescriptors(obj)
        )
        console.log(Object.getOwnPropertyDescriptors(obj2),'obj2')
        //创建子类
        function SupperClass() {}
        SupperClass.prototype = {}
        function SubClass() {}
        SubClass.prototype = Object.create(SupperClass.prototype,Object.getOwnPropertyDescriptors({}))`

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: JavaScript中的Object对象有许多常用方法。其中一些方法包括: 1. Object.create(proto, \[propertiesObject\]): 创建一个新对象,使用现有的对象作为新对象的原型。可以选择性地传入一个属性描述对象来定义新对象的属性。 2. Object.getOwnPropertyNames(obj): 返回一个数组,包含指定对象自身的所有属性的名称,包括不可枚举的属性。 3. Object.setPrototypeOf(obj, prototype): 设置一个对象的原型对象。该方法用于设置一个对象的原型对象,并返回该对象本身。 4. Object.getOwnPropertyDescriptor(obj, prop): 获取指定对象的指定属性属性描述符对象。 5. Object.keys(obj): 返回一个数组,包含指定对象自身的所有可枚举属性的键名。 6. Object.values(obj): 返回一个数组,包含指定对象自身的所有可枚举属性的值。 这些方法可以帮助我们在JavaScript中操作和处理对象。 #### 引用[.reference_title] - *1* [js Object方法大全](https://blog.csdn.net/duguxueao/article/details/123771968)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [JavaScript中对象(Object)的方法](https://blog.csdn.net/weixin_51033461/article/details/120825483)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值