ES6通过class关键字定义类
class User{
constructor(name){ //构造方法,通过new命令生成对象实例时,自动调用该方法
this.name = name
}
Hi(){
console.log('Hi'+this.name)
}
}
var user = new User('法外狂徒张三')
user.Hi()
ES6通过extends关键字继承父类的属性和方法
class Father{
constructor(x, y){
this.x = x
this.y = y
}
add(){
console.log(this.x + this.y)
}
}
class Child extends Father{
constructor(x, y){ // 构造方法,通过new命令生成对象实例时,自动调用该方法
super(x, y) // 执行父类的构造函数
this.x = x // 必须先执行父类的构造函数,子类才能用this声明自己的属性
this.y = y // this指向创建出来的实例对象
}
sub(){ //子类自己的方法
console.log(this.x - this.y)
}
}
var child = new Child(1,1)
child.add() // 调用父类的方法
child.sub()
ES6之前我们通过构造函数来模拟类
function User(name){
this.name = name
}
//如果方法在构造函数里面定义,那么每创建一个实例对象就要为方法开辟内存空间,太浪费了
//把方法定义在prototype(原型对象)上面,所有创建的实例就可以通过__proto__属性共享方法了
//ES6用class声明的类,它里面的方法也是这样干的
User.prototype.Hi = function(){
console.log('Hi'+ this.name)
}
var user = new User('法外狂徒张三')
user.Hi() //user身上本来没有Hi方法的,通过__proto__属性去prototype(原型对象)身上找
ES6之前我们通过构造函数+原型对象来模拟类的继承
通过构造函数来继承属性
通过原型对象来继承方法
function Father(name){
this.name = name
}
Father.prototype.Hi = function(){
console.log('Hi')
}
function Child(name){
// 通过构造函数来继承属性
// 子构造函数要想使用父构造函数的属性必须把它的this重新指向到自己
Father.call(this,name)
}
// 通过原型对象来继承方法
Child.prototype = new Father() // 实例对象既可以拿到构造函数的方法,又不会影响原来的构造函数
Child.prototype.constructor = Child //重新指会自己的构造函数
var child = new Child('法外狂徒张三')
console.log(child.name)
child.Hi()