es6对象的扩展

es6不仅为字符串、数值和数组带来了扩展,也为对象带来了很多新的特性。

1.es6对象简洁的写法

// 传统写法
    var obj = {
        name:'lichao',
        say:function(){
            alert(this.name)
        }
    }
    console.log(obj)
    obj.say()

// es6写法
    var name = 'lichao';
    var age = 10;
    var obj1 = {name,age};

// es6方法的写法
var obj1 = {
        name,
        age,
        say(){
            alert(this.name)
        }
    };
// 这种简洁的写法将变量的名字变成了对象key的名字,变量的值变为对象属性的值。


2.属性名可以是表达式
用字面量定义一个对象的时候,可以用表达式作为对象的属性名和方法名。

var objName = 'my';
    var objName1 = 'name';
    var objName2 = 'say';

    var obj = {
        [objName + objName1]:'我是李超',
        [objName2 + objName1](){
            alert('我是李超')
        }
    }

// 字面量??? 什么意思 ? 就是用{}定义对象的时候
    var obj = {}


需要注意的是,用以上方法定义对象的属性名和方法名的时候,属性名和方法名需要用中括号括起来,里面是一个字符串相加的表达式。

3.Object.is()函数
函数作用:比较两个值是否严格相等,或者说是全等。

    var a = '10';
    var b = 10;
    console.log(a == b);  // 抽象相等
    console.log(a === b); // 严格相等
    console.log(Object.is(a,b))  // **而Object.is()函数的作用和===作用是一样的。**


4.Object.assign()函数
函数的作用:将源对象的属性复制到目标对象上。除此之外,需要注意的是,若是目标对象和源对象有相同的属性,源对象会将目标对象的属性覆盖。源对象可以是一个,也可以是多个。(该方法是浅拷贝)

    // 目标对象
    var target = {name:'li'};
    // 源对象
    var origin = {age:10};
    Object.assign(target,origin);
    console.log(target)
    Object {name: "li", age: 10}


    var origin1 = {name:'lichao'};
    Object.assign(target,origin1);
    console.log(target)
// 目标对象
var target = {name:'li'};

// 源对象
var origin = {age:10};
Object.assign(target,origin);
console.log(target)
Object {name: "li", age: 10}

var origin1 = {name:'lichao'};
Object.assign(target,origin1);
console.log(target)


相同作用:JSON.parse(JSON.stringify(obj)
需要注意的是:1.当对象下的某个属性值为undefined的时候,该属性不会被拷贝。2.不能拷贝函数(assign可以)

        var obj = {
            name:'lichao',
            age:24,
            friends:{
                name:'wang',
                age:23,
            }
        }

        var obj2 = JSON.parse(JSON.stringify(obj));
        obj2.friends.name = 'xiaobai';
        console.log(obj) // wang
        console.log(obj2) // xiaobai   使用JSON.parse(JSON.stringify(obj)可以对对象进行深拷贝


巧妙利用Object.assign()函数的功能,我们可以完成很多效果。比如:给对象添加属性和方法,克隆对象,合并多个对象,为对象的属性指定默认值。

5.Object.getPrototypeOf()函数
函数作用:获取一个对象的prototype属性。也就是写在原型上的属性。

    var obj = {
        name:'1111'
    }
    obj.prototype = {
        age:10
    };
    var abj = new obj();
    console.log(abj.getPrototypeOf(obj))
  // 报错 obj is not a constructor  这的意思是需要用构造函数的方法来声明对象

// 必须使用构造函数的方式来声明对象并且属性要写在原型链上
    function preson(){  //自定义一个preson类()函数
        this.name = 'li'

    }
    preson.prototype = { //函数都有一个预置属性prototype对象
        say(){
            console.log(111)
        }
    }
    console.log(preson)
    var obj = new preson();
    console.log(Object.getPrototypeOf(obj))  // 此时对象打印为say(),因为原型上没有自定义的属性

    //捋一下思路。把函数preson用new关键字调用,这个时候函数preson就相当于构造函数或者说是一个类,实例化后是一个对象。这个对象会继承preson类的属性和方法。


6.Object.setPrototypeOf()函数
函数作用:设置一个对象的prototype属性。

Object.setPrototypeOf(
    preson,
    {say(){console.log(2222)}}
    )

    // Object.setPrototypeOf()函数对对象的prototype属性进行了修改,具体的修改是重写了say()方法。


7.模拟面向对象编程的关键步骤:
1.构造函数 2.给prototype对象添加属性和方法 3实例化 4.通过实例化后的对象调用类的方法或者属性。

总结:本次我们学习了es6对对象的一些扩展,包括:对象更简洁的写法属性名可以是表达式Object.is()函数Object.assign()函数Object.getPrototypeOf()函数Object.setPrototypeOf()函数模拟面向对象编程的关键步骤


兴趣遍地都是,专注和持之以恒才是真正稀缺的。

你可能感兴趣的:(es6)