2-1继承

JS本身不具备继承,是我们通过语法模拟出来的

// 例子:王思聪继承王健林的家产
var wjl = {
    name: '王健林',
    age: 55,
    hours: '豪宅数套',
    mony: '用不完的钱'
}
var wsc = {
    name: '王思聪',
    age: 28
}
//遍历王健林对象,把家产赋值给王思聪
for(var i in wjl) {
    //当王思聪和王健林中有同名属性时,跳过
    if(wsc[i]) {
        continue;
    }
    wsc[i] = wjl[i];
}
console.log(wjl);
console.log(wsc);
其实上面只能算是对象的拷贝
// 继承是 类型和类型之间的关系
-------------------------原型继承--------------------------
function Teacher() {
    /*this.name = 'zs';
    this.age = 23;
*/
    this.salary = 8007;
}

function Student() {
    /*this.name = 'ls';
    this.age = 44;*/

    this.score = 90;
}
//上面有共同的代码,我们可以把他们抽出来,做一个共同的构造函数Person
function Person() {
    this.name = '人类';
    this.age = '你猜';
}
我们知道当调用一个属性时,如果本身的对象里没有,会去原型中查找,所以我们可以这样
Teacher.prototype = new Person();//原型也是一个对象
// 这个就是原型继承了,现在Teacher也有name和age属性了
// 原型继承并不能用,因为他只能给Person构造函数传一次参数,当我们要创建多个老师的时候,明显不能用
var teacher = new Teacher();
console.dir(teacher.__proto__.constructor);//返回的是Person的构造函数,所以我们还需要修改原型对象的constructor值
Teacher.prototype.constructor = Student;
console.dir(teacher.__proto__.constructor);//这下返回的是Student的构造函数了,记得如果修改了原型对象,要重新设置constructor的值
原型继承并不能用,因为他只能给Person构造函数传一次参数,当我们要创建多个老师的时候,明显不能用

---------------------------------借用构造函数的继承方式--------------------// 借用构造函数
利用了函数的call()方法,

// 创建Person的构造函数
function Person(name, age) {
    this.name = name;
    this.age = age;
}
//Person.sayHi()
Person.prototype.sayHi = function () {
    console.log('你好');
}

// 创建Teacher的构造函数
function Teacher(name, age, score) {
    // 将Person中的this指向Teacher
    Person.call(this, name, age);
    this.score = score;
}
使用借用构造函数这种方法可以继承属性,但是遗憾的是不能继承方法

-----------------------------------------组合继承-------------------------------------
// 组合继承(结合原型继承和借用构造函数继承)

// Person构造函数
function Person(name, age) {
    this.name = name;
    this.age = age;
}
// Person的sayHi()方法
Person.prototype.sayHi = function () {
    console.log('你好');
}
// Student构造函数
function Student(name, age, score) {
    Person.call(this, name, age);//借用构造函数继承,继承属性
    this.score = score;
}
Student.prototype = new Person();// 原型继承,继承方法

// Teacher的构造函数
function Teacher(name, age, salary) {
    Person.call(this, name, age);
    this.salary = salary;
}
Teacher.prototype = new Person();//原型继承,继承方法

Student.prototype.constructor = Student;//如果重新设置了原型对象,要重新设置里面的constructor
Teacher.prototype.constructor = Teacher;

var stu = new Student('zs', 34, 55);
var tea = new Teacher('ls', 33, 989);
console.log(stu);
console.log(tea);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容