# ES5创建对象继承

# es5里面的类

# 最简单的类

function Person(){
    this.name = '张三',
    this.age = 18
}
var p = new Person()
console.log(p.name)  // 张三

# 构造函数和原型链添加方法

es5中类的属性和方法既可以在构造函数中定义也可以在原型链上添加

function Person(){
    this.name = '张三',  // 属性
    this.age = 18        // 属性
    this.run = function(){
        console.log(`${this.name}在疯狂的奔跑`)
    }
}
// 原型链上的属性会被多个实例共享,构造函数不会
Person.prototype.skin = '黄'   // 在原型链上添加属性
Person.prototype.eat = function(){
    console.log(`${this.name}在吃饭!!!`)
}
var p = new Person();
p.run()             // 张三在疯狂的奔跑
console.log(p.skin) // 黄
p.eat()             // 张三在吃饭

# 类里面的静态方法

function Person(){
    this.name = '张三',  
    this.run = function(){   // 实例方法必须在new 出的实例中调用
        console.log(`${this.name}在疯狂的奔跑`)
    }
}
// 创建静态方法
Person.getName = function(){
    console.log('我是类中的静态方法')
}
var p = new Person()
p.run()          // 调用实例方法
Person.getName() // 调用静态方法 

# es5中的继承

function Person(){
    this.name = '张三',  
    this.run = function(){
        console.log(`${this.name}在疯狂的奔跑`)
    }
}
Person.prototype.eat = function(){
    console.log(`${this.name}在吃饭!!!`)
}
 function inheritClass(){
     Person.call(this)  // 对象冒充继承
 }
 var inhert = new inheritClass()
 console.log(inhert.name)
 inhert.run()
//  对象冒充继承可以继承构造函数里面的属性和方法  不能继承原型链上的属性和方法
 inhert.eat() // 报错

# 原型链实现继承

function Person(){
    this.name = '张三',  
    this.run = function(){
        console.log(`${this.name}在疯狂的奔跑`)
    }
}
Person.prototype.eat = function(){
    console.log(`${this.name}在吃饭!!!`)
}
 function proInheritClass(){
     proInheritClass.prototype = new Person()
     Person.call(this)  // 对象冒充继承
 }
 // 原型链继承 构造函数和原型链上的属性和方法都可以被继承

 var pro = new proInheritClass()
 console.log(pro.name)
 pro.run()
 // 调用继承自原型链上的方法
 pro.eat()

# 原型链继承的问题

提示

原型链能继承父类的构造函数的属性和方法,也能继承原型链上的属性和方法。

但是实例化子类的时候没法给父类传参

# 原型链+构造函数组合继承模式

function Person(name){
    this.name = name,  
    this.run = function(){
        console.log(`${this.name}在疯狂的奔跑`)
    }
}
Person.prototype.eat = function(){
    console.log(`${this.name}在吃饭!!!`)
}
 function proInheritClass(name){
     Person.call(this,name)  // 对象冒充继承 实例化子类可以给父类传参
 }
 proInheritClass.prototype = new Person()  //另一种写法 proInheritClass.prototype = Person.prototype

 var pro = new proInheritClass('赵云')
 
 console.log(pro.name)
 pro.run()  // 赵云在疯狂的奔跑

 // 调用继承自原型链上的方法
 pro.eat()  // 赵云在吃饭!!!

#

Last Updated: 9/16/2020, 12:05:11 AM