一、ES5中,
- a. 类的创建
new一个function类,在function中的prototype里面添加属性和方法,例如先创建一个Animal类,并且添加一个原型方法eat
//定义一个动物类
function Animal(name){
this.name=name //属性
this.text=function(){ //实例方法
console.log('text')
}
}
Animal.prototype.eat=function(){
console.log('吃吃吃')
}
- b.类的引用与继承
创建一个Dog类,添加age属性将Animal中的实例属性与方法通过apply()应用到Dog中。这时我们创建一个dog继承自Dog类给他两个参数,这时我们利用instanceof进行结果的判断。dog继承自Dog,但是Dog并不继承自Animal,并且dog不能调用Animal的原型方法,只是将其的实例属性与方法进行了引用
function Dog(name,age){
Animal.apply(this,arguments) //借用不是继承
this.age=age
}
var dog = new Dog('zs',12)
console.log(dog)//打印dog,
console.log(dog instanceof Dog) //dog是否继承于Dog 结果为true
console.log(Dog instanceof Animal)//Dog是否继承于Animal 结果为false
// dog.eat() //不能调用原型中的方法
当我们将Dog的原型设置为Animal时,则Dog继承自Animal,dog1也继承自Animal,dog1也可以调用Animal中的原型方法
Dog.prototype=new Animal()
var dog1 = new Dog('ls',17)
console.log(dog1)
console.log(Dog instanceof Animal) //true
console.log(dog1 instanceof Animal) //true
dog1.eat() //调用原型方法
二、ES6
ES6中添加了class,目的是为了更接近与传统的语法,使用class创建类,extends进行继承
class Animal{
//每一个类都有构造器,如果没有写会被自动添加
constructor(name,age){
this.name=name
this.age=age
}
eat(){ // 实例方法 原型方法
// 实际上类的所有方法都定义在类的prototype属性上面
// 在类的实例上面调用方法,其实就是调用原型上的方法。
console.log('吃吃吃')
}
//静态方法
static sleep(){// 静态方法只能由类本身进行调用,实例不能调用
console.log('睡睡睡')
}
}
class Dog extends Animal{
constructor(name,age,gender){
super(name,age)
this.gender=gender
}
food(){
super.eat()
}
static night(){
super.sleep()
}
}
let dog = new Dog('zs',12,'male')
console.log(dog)
console.log(dog instanceof Dog) //true
console.log(Dog instanceof Animal) //true
console.log(dog instanceof Animal) //true
dog.food()
// dog.night() //不能调用静态方法,只能类本身调用
Dog.night()