一、对象可以动态添加属性、函数(原有功能)
用.点运算符就能添加属性,函数也是直接定义。
//声明一个对象
let student = {};
//添加属性和方法
student.name = "小王";
student.say = function(){
console.log(this.name + "发言了");
};
//调用方法
student.say();
console.log(student);
二、简化对象写法
1、ES6允许在大括号里面,直接写入变量和函数,作为对象的属性和方法,这样的书写更加简洁。
let name = '张三';
let change = function(){
console.log('开始学习了');
}
const school = {
name,
change,
improve(){
console.log('学习提高了');
}
}
console.log(school);
school.improve();
2、对象内定义函数也简化了
以前是improve: function (){};
三、Symbol类型
1、ES6引入了一种新的原始数据类型Symbol。表示独一无二的值。它是JavaScript语言的第七种数据类型,是一种类似于字符串的数据类型。
2、Symbol特点
(1)Symbol的值是唯一的,用来解决命名冲突的问题。
(2)Symbol值不能与其他数据进行运算。
(3)Symbol定义的对象属性不能使用for...in循环遍历,但是可以使用Reflect.ownKeys来获取对象的所有键名。
3、Symbol创建
//1. 使用Symbol()方法
let s = Symbol();
console.log(s, typeof s);
let s2 = Symbol('张三');
let s3 = Symbol('张三');
console.log(s2 === s3); //false
//2. Symbol.for 创建
let s4 = Symbol.for('张三');
let s5 = Symbol.for('张三');
console.log(s4 === s5); //true
4、js数据类型小结
口诀:USONB
u:undefined
s:string symbol
o:object
n:null number
b:boolean
四、Symbol的作用
1、给对象添加属性和方法,表示独一无二的。
//向对象中添加方法:up、down
//但是我不知道game对象中是否已经有了up和down方法
let game = {
up: function() {
console.log("向上1");
},
down: function() {
console.log("向下1");
},
name: "俄罗斯方块"
}
//声明一个对象
let methods = {
up: Symbol(),
down: Symbol()
}
game[methods.up] = function() {
console.log("向上2");
}
game[methods.down] = function() {
console.log("向下2");
}
console.log(game);
可以看到它原来有一个up()方法和down()方法,Symbol安全的给对象添加了方法。
2、[Symbol('描述符')],定义方法
let youxi = {
name: "狼人杀",
[Symbol('say')]: function(){
console.log("我可以发言");
},
[Symbol('zibao')]: function(){
console.log("我可以自爆");
}
}
console.log(youxi);
五、Symbol内置值
1、除了定义自己使用的Symbol值以外,ES6还提供了11个内置的Symbol值,指向语言内部使用的方法。
https://es6.ruanyifeng.com/#docs/symbol
2、Symbol.hasInstance
重写instanceof方法。
//这个Person的class和构造函数是一样的,为了实例化对象而用的
class Person{
static [Symbol.hasInstance](param){
//类似于重写instanceof方法,自己来实现
console.log(param);
console.log("我被用来检测类型了");
return true;
}
}
let o = {};
console.log(o instanceof Person); //true
3、Symbol.isConcatSpreadable
当我们使用concat()来合并数组的时候,通过这个属性的设置,来决定我们的这个值可不可以展开。
const arr = [1,2,3];
const arr2 = [4,5,6];
//正常合并
console.log(arr.concat(arr2));
//设置Symbol.isConcatSpreadable
arr2[Symbol.isConcatSpreadable] = false; //不可展开
console.log(arr.concat(arr2)); //arr2作为一个整体加入到了arr中
4、其余的属性都是来控制对象在特定场景下的表现
扩展对象功能。