ES6——对象扩展

1.属性的简洁表示法

(1)属性和方法

/*允许在对象内部直接使用变量【即属性和属性值变量一致,可以简写】*/
    let name='张三';
    let stu={
        name,
        //等同于
        //name:name
        sleep(){},
        //等同于
        sleep:function(){}
    }

简写方法不能当做构造函数来使用

(2)属性的的getter setter访问器

    let person={
        get name(){
            console.log("获取name属性");
            return this._name;
        },
        set name(n){
            console.log("设置name属性");
            this._name=n; //注意不要同名 否则会死循环
        },
        
        init(){}
    }
    console.log(person);
    person.name="张三";  //设置name属性
    console.log(person.name);  //获取name属性  张三

    //简写方法不能当做构造函数来使用
    new person.init(); //person.init is not a constructor

2.属性名表达式

对象取值
方法一:对象.属性
方法二:对象[key] (不止可以取值 还能监测属性是否存在)

如果使用字面量方式定义对象(使用大括号),在 ES5 中只能使用方法一

	var obj = {
	  foo: true,
	  abc: 123
	};

ES6 允许字面量定义对象时,用方法二(表达式)作为对象的属性名,即把表达式放在方括号内

    let key="name";
    let obj={
        [key]:'张三'
    }
    console.log(obj); //{name: '张三'}
    console.log(obj[key]); //张三
    console.log(obj['name']); //张三

3.方法的 name 属性

方法的name属性返回函数名(即方法名)

    const person = {
        sayName() {
            console.log('hello!');
        }
    };
    console.log(person.sayName.name);   //sayName

getter setter访问器

不能直接获取getter setter访问器的函数名称(undefined)

	//es6 get set 访问器写法
    let obj={
        get sex(){return this._sex;},
        set sex(n){this._sex=n;}
    }
    console.log(obj.sex.name);  //undefined)

在这里插入图片描述
可以使用getOwnPropertyDescriptor获取

	//获取getter setter访问器 函数名称
    let descr=Object.getOwnPropertyDescriptor(obj,'sex');
    console.log(descr);

在这里插入图片描述

Object.getOwnPropertyDescriptor(object, propertyname) 方法返回指定对象上一个自有属性对应的属性描述符。(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性)
obj:需要查找的目标对象
prop:目标对象内属性名称

补充: es5使用原生js在对象上设置getter,setter访问器

    //设置多个属性
    Object.defineProperties(obj,{
        name:{
            get: function () {
                return this.firstName+this.lastName;
            },
            set: function (n) {
                let firstName= n.split('-')[0];
                let lastName= n.split('-')[1];
                this.firstName=firstName;
                this.lastName=lastName;
            }
        }
    });
    console.log(obj);
    obj.name="李-四";
    console.log(obj.name);

	//设置单个属性 Object.defineProperty ```

4.属性的可枚举性和遍历

(1)可枚举 enumerable

描述对象的enumerable属性,称为“可枚举性”,如果该属性为false,就表示某些操作会忽略当前属性

遍历只对可枚举属性遍历
在这里插入图片描述

(2)遍历对象的属性

  1. for…in
    遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)

  2. Object.keys(obj)
    返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名

  3. Object.getOwnPropertyNames(obj)
    返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名

5.super 关键字

this关键字总是指向函数所在的当前对象,
ES6 又新增了另一个类似的关键字super,指向当前对象的原型对象

    let person={
        name(){
            console.log("全名称");
        }
    }
    let student={
       sleep(){
            console.log(this); //{sleep: ƒ sleep()}
            super.name(); //全名称
       }
    }
    //设置原型对象
    Object.setPrototypeOf(student,person);
    student.sleep();

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

致可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值