*原型链继承:
1.定义父类型构造函数
2.给父类型的原型添加方法
3.定义子类型的构造函数
4.创建父类型的对象赋值给子类型的原型
5.将子类型原型的构造属性设置为子类型
6.给子类型原型添加方法
7.创建子类型的对象: 可以调用父类型的方法
*关键:
1.子类型的原型为父类型的一个实例对象
function Super(){
this.SuperPro = "SuperPro";
}
Super.prototype.showSuper = function(){
console.log(this.SuperPro);
}
function Sub(){
this.SubPro = "SubPro";
}
Sub.prototype.showSub = function(){
console.log(this.SubPro);
}
//让子类型的原型成为父类型的原型的属性
Sub.prototype = new Super();
//让子类型的原型的constructor指向子类型,不实现此举,则Sub的构造函数是Super()
Sub.constructor = Sub;
var son = new Sub();
son.showSuper(); //SuperPro
var senior = new Super();
senior.showSuper(); //SuperPro
//借用构造函数继承(假的,并没有继承,简化了代码罢了)
*定义父类型构造函数
*定义子类型构造函数
*在子类型构造函数中调用super()调用父类型构造函数
function Person(name , age){
this.name = name ;
this.age = age;
}
function Student(name , age , price){
Person.call (this,name,age);
//相当于: this.Person(name,age);
// this.name = name ;
// this.age = age ;
this.price = price;
}
var s = new Student("Vodka",20,10000);
console.log(s.age,s.name ,s.price); //20,Vodka 10000
// 原型链+借用构造函数的组合继承
// *利用原型链实现对父类型对象的方法继承
// *利用super()借用父类型构建函数初始化相同属性
function Person(name ,age ){
this.name = name ;
this.age = age ;
}
function Student(name , age , price){
Person.call(this,name,age); //使子类成为父类构造函数的调用对象,给子类添加属性
this.price = price;
}
//使子类的原型对象成为父类的一个实例对象,这样子类就可以访问父类原型对象中的属性和方法
Student.prototype = new Person();
//修正Student的构造函数的指向,让它指向Student,而不是Person
Student.prototype.constructor = Student;
Person.prototype.setName = function(name){
this.name = name ;
}
Student.prototype.setPrice = function(price){
this.price = price ;
}
var s = new Student("James",98,999); //James 98 999
console.log(s.name,s.age,s.price); //name和age所属对象是Person,price的所属对象属于Student
s.setName("Vodka"); //该方法所属对象是Person.prototype
s.setPrice(8989); //该方法所属对象是Function.prototype
console.log(s.name,s.age,s.price); //Vodka 98 8989