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()函数 、模拟面向对象编程的关键步骤。
兴趣遍地都是,专注和持之以恒才是真正稀缺的。