Symbol数据类型
es5的对象属性名都是字符串类型,这容易造成属性名冲突,Symbol数据类型会保证值的唯一性
数据类型:数字(number),布尔(Boolean),字符串(String),null,undefined,Symbol,BigInt,对象Object
定义
var s=Symbol("asd")
主要用来让对象的属性不冲突
//第一种
var obj={}
var sm=Symbol("schl")
obj[sm]="清华大学"
console.log(obj)//{Symbol(schl): '清华大学'}
//第二种
var sm=Symbol("schl")
var obj={[sm]:"哈工大"}
console.log(obj)//{Symbol(schl): '哈工大'}
//第三种
var obj={}
var sm=Symbol("schl")
Object.defineProperty(obj,sm,{value:"黑龙江大学"})
console.log(obj)//{Symbol(schl): '黑龙江大学'}
属性和方法
for()如果有Symbol值,则返回,没有则新建
keyfor()返回Symbol的for函数的值
replace()替换Symbol的值
match()查找Symbol的值
split()分割Symbol的值
toString()转化成字符串
面向对象扩展
定义对象用class声明,让js更接近于后台语言的写法,但是class是声明的语法糖,而对象本身和ES5的对象没有区别
class Person{//class声明对象
constructor(name,age){//构造器
this.name=name//this调用属性和方法
this.age=age
}
say(){//方法可以简写
console.log(this.name+","+this.age)
}
}
var p=new Person("wei",20)
console.log(p)
p.say()
注意:class的定义默认使用了严格模式,所有无需自己在手动添加
class声明的对象没有变量提升
var p=new Person("wei",20)
console.log(p)//报错
class Person{}
对象的私有属性:
不用this关键字引用,建议“#”声明
class Point{
#x=2;
constructor(y){
this.y=y
}
}
对象的私有方法:
不用this关键字引用,建议“_”声明
class Point{
say(){
console.log(this.y)//公有
}
_fun(){
console.log("ffff")//私有
}
}
静态属性和静态方法
用static修饰静态,当被定义成静态属性和方法时,不能被实例继承,并且可以直接通过类调用该属性和方法
静态属性:
class Emp{
name="lisi"//方法1
static age=23//方法2
constructor(x){
this.x=x
}
}
console.log(Emp.age)//23没new对象之前就可以调用
静态方法:
class Emp{
static fun1(){
console.log("静态方法")
}
fun2(){
console.log("普通方法")
}
}
Emp.fun1()//静态方法