class
ES6 提供了更加接近传统语言 **Java、C++** 的写法,引入了**Class(类)** 这个概念,作为对象的模板。通过 `class` 关键词,可以定义类。基本上,ES6 的 `class` 可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的 `class` 写法只是让对象原型的写法更加清晰、更加**面向对象编程**的语法而已。知识点:
class
声明类constructor
定义构造函数初始化extends
继承父类super
调用父级构造方法static
定义静态方法和属性- 父类方法可以重写
初体验:
// 手机
function Phone(brand, price) {
this.brand = brand
this.price = price
}
// 添加方法
Phone.prototype.call = function() {
console.log('我可以打电话')
}
// 实例化对象
let Huawei = new Phone('华为',5999)
Huawei.call()
console.log(Huawei, typeof Huawei) // Phone {brand: "华为", price: 5999} "object"
// class
class Shouji {
// 构造方法 名字不能修改
constructor(brand, price) {
this.brand = brand
this.price = price
}
// 方法必须使用该语法,不能使用 ES5 的对象完整形式
call() {
console.log('我可以打电话')
}
}
let onePlus = new Shouji('1+',1999)
console.log(onePlus, typeof onePlus) // Phone {brand: "1+", price: 1999} "object"
静态成员:
// function Phone() {
//
// }
//
// // 这两个属性是属于函数对象的,不属于实例对象,这些称为静态成员
// Phone.name = '手机'
// Phone.change = function () {
// console.log('我可以改变你世界')
// }
// Phone.prototype.size = '5.5inch'
// let nokia = new Phone()
//
// console.log(nokia.name)
// // nokia.change()
// console.log(nokia.size)
class Phone {
// 静态属性
static name = '手机'
static change() {
console.log('我可以改变世界')
}
}
let nokia = new Phone()
console.log(nokia.name) // undefined
console.log(Phone.name) // 手机
// 对于 static 标注的属性是属性和方法,它是属于类而不属于实例对象
ES5的继承:
// 手机
function Phone(brand, price) {
this.brand = brand
this.price = price
}
Phone.prototype.call = function () {
console.log('我可以打电话')
}
// 智能手机
function SmartPhone(brand,price,color,size) {
Phone.call(this,brand,price)
this.color = color
this.size = size
}
console.log(new Phone,typeof new Phone) // Phone {brand: undefined, price: undefined} "object"
// 设置子级构造函数的原型
SmartPhone.prototype = new Phone
SmartPhone.prototype.constructor = SmartPhone
// 声明子类的方法
SmartPhone.prototype.photo = function () {
console.log('我可以拍照')
}
SmartPhone.prototype.playGame = function () {
console.log('我可以玩游戏')
}
const chuizi = new SmartPhone('锤子','2499','black','5.5inch')
console.log(chuizi)
ES6类继承:
class Phone {
constructor(brand, price) {
this.brand = brand
this.price = price
}
call() {
console.log('打电话')
}
}
class SmartPhone extends Phone {
// 构造方法
constructor(brand, price, color, size) {
super(brand, price); // Phone.call(this,brand,price)
this.color = color
this.size = size
}
photo() {
console.log('拍照')
}
playGame() {
console.log('玩游戏')
}
call() { // 子类对父类的方法重写
super.call() // 子类调用父类的同名方法
console.log('我可以视频通话')
}
}
const xiaomi = new SmartPhone('小米','799','黑色','4.7inch')
xiaomi.call()
xiaomi.photo()
xiaomi.playGame()
console.log(xiaomi)
get和set:
// get 和 set
class Phone {
get price() {
console.log('价格属性被获取了')
return 'iloveyou'
}
set price(newVal) {
console.log('价格属性被修改了',newVal)
}
}
// 实例化对象
let s = new Phone()
console.log(s.price)
s.price = 'free'