构造函数继承
原理:
利用call,apply,bind等方法,在构造函数内部去调用别的构造函数,为己所用.
缺点:
原型对象的函数无法复用
function People(name,age) {
this.name = name;
this.age = age;
}
People.prototype.action = function () {
console.log("复习");
}
function Student(name,age) {
People.call(this,name,age);
}
var student1 = new Student("mark",21);
console.log(student1);
原型继承
优点:
实现了原型对象内的函数复用.
缺点:
虽然得到了属性值,但无法在实例对象内灵活的传参,根本不能用.
function People(name,age) {
this.name = name;
this.age = age;
}
People.prototype.action = function () {
console.log("复习");
}
function Student(name,age,banji) {
this.banji = banji;
}
// People的实例对象一定可以使用People的所有功能,
//new People中需要传参。
// 沿着原型链向上寻找属性值和方法
Student.prototype = new People("jack",25);
Student.prototype.constructor = Student;
Student.prototype.trouble = function () {
console.log("考试");
}
var student1 = new Student("mark",20,"2班");
console.log(student1.name, student1.age);//jack,25
student1.action();//复习
student1.trouble();//考试
组合继承
原理:
构造函数继承与原型链继承的组合使用.
优势:
既实现了原型对象内的函数复用,又可以在实例对象内灵活的传参.
function People(name,age) {
this.name = name;
this.age = age;
}
People.prototype.action = function () {
console.log("复习");
}
function Student(name,age) {
People.call(this,name,age);
}
// 由于使用借用构造函数继承的方式给Student设置了自身的属性name和age,
// 所以new People中的参数不需要传入。
Student.prototype = new People();
// 由于使用了覆盖方式设置原型,需要补全constructor属性
Student.prototype.constructor = Student;
// 注意:单独设置的功能需要在继承操作后设置。
Student.prototype.trouble = function () {
console.log("考试");
}
var student1 = new Student("mark",20);
console.log(student1.name);//mark
student1.action();//复习
student1.trouble();//考试