? ? ? ? ?直接解释构造继承可能有些晦涩难懂,所以我尽量用一个通俗易懂的例子,深入浅出的解决这个问题。这里有一个构造函数Person,一个构造函数Student,一个Student的实例化对象stu,现在要实现的是让stu不仅能继承到Student构造函数及其原型上的属性和方法,还要继承到Person构造函数及其原型上的属性和方法。
//Person构造函数
function Person(name, hair) {
this.name = name;//Person构造函数里的属性
this.hair = hair;//Person构造函数里的属性
this.sleep = function () {
console.log('爱睡觉');;
}//Person构造函数里的方法
}
//Student构造函数
function Student(age, a, b) {
this.age = age;//Student构造函数里的属性
this.eat = function () {
console.log('爱吃饭');
}//Student构造函数里的方法
Person.call(this, a, b)//这里是构造继承的核心哦!!!!!!
}
//Person构造函数的原型
Person.prototype.num = 10;//Person原型上的属性
Person.prototype.play = function () {
console.log('爱玩游戏');
};//Person原型上的方法
Student.prototype = new Person;
//注意注意!!!这句话十分重要!!!它就是原型继承,因为构造继承无法继承到Person原型上的属性和方法,所以这里借助构造继承让stu继承到Person原型上的属性和方法,即把Student的原型设为Person的实例化对象。这句话一定要写在Student.prototype设置属性和方法的上边,否则你设置的Student.prototype的属性和方法就会被这句话覆盖掉。
Student.prototype.sex = '小姑娘';//Student原型上的属性
Student.prototype.study = function () {
console.log('爱学习');
}//Student原型上的方法
var stu = new Student(18, '小学生', '黑色')
console.log(stu.name);
console.log(stu.hair);
stu.sleep()
console.log(stu.age);
stu.eat()
console.log(stu.num);
stu.play()
console.log(stu.sex);
stu.study()
打印的结果:当然是都可以获取到啦