通过class关键字,能够定义类。该办法定义的原型对象跟ES5定义的没有多少区别,只是用class的写法能让对象原型的定义更加清晰,更像面向对象编程的语法。
class Person{ constructor(name,age){ this.name = name; this.age = age; this.fun = ()=>console.log('constructor内的办法能够被遍历到哦') } say() { console.log(`My name is ${this.name}`) }}let p1 = new Person('Liane',18)p1.say() //My name is Liane//应用class创立的构造函数,所有的办法都会被定义在prototype属性下面,因而是不可能被遍历到的。console.log(p1) //{name: 'Liane', age: 18,fun: f}for(let k in p1){ console.log(k) //name //age //fun}//所以,增加类的办法能够应用Object.assign()办法,一次性向类增加多个办法Object.assign(Person.prototype, { growUp(){ return ++this.age }, eat(food){ console.log(`${this.name}吃了${food}`) }})p1.growUp()console.log(p1.age) //19p1.eat('apple')//也可应用Object.getPrototypeOf(obj)办法获取obj的原型对象,再为原型增加办法或属性Object.getPrototypeOf(p1) === Person.prototype //true
this的指向:
类的办法外部如果有this,它默认是指向类的实例,但如果将该办法提出来独自应用,this会指向该办法运行时的环境。因而咱们能够应用bind绑定this,或者应用箭头函数来解决。
class Logger{ printName(name){ this.print(`Hello ${name}`) } print(text){ console.log(text) }}const logger = new Logger();const {printName} = logger;printName('Liane') //报错
应用bind绑定this
class Logger{ constructor(){ this.printName = this.printName.bind(this) } printName(name){ this.print(`Hello ${name}`) } print(text) { console.log(text) }}const logger = new Logger();const {printName} = logger;printName('Liane') //'Hello Liane'
应用箭头函数
class Logger{ constructor(){ this.printName =(name)=>this.print(`Hello ${name}`); } print(text) { console.log(text) }}const logger = new Logger();const {printName} = logger;printName('Liane') //'Hello Liane'