关于原型的继承问题

原型的作用

	 原型作用:数据共享,目的:为了节省内存空间,
    原型作用:继承 目的是:为了节省内存空间

继承

	 原型继承:改变原型的指向
    借用构造函数继承: 主要解决属性的问题
    组合继承:原型继承+借用构造函数继承

原型继承

function Person(name, age, sex, weight) {
            this.name = name
            this.age = age
            this.sex = sex
            this.weight = weight
        }
        Person.prototype.sayHi = function() {
            console.log("您好");

        }

        function Student(score) {
            this.score = score
        }
        //希望人的类别中的数据可以共享给学生---继承
        Student.prototype = new Person("小明", 10, "男", "50kg")
        var stu1 = new Student("100")
        stu1.sayHi()
        console.log(stu1.name, stu1.age, stu1.sex, stu1.weight, stu1.score)
        var stu2 = new Student("120")
        stu2.sayHi()
        console.log(stu2.name, stu2.age, stu2.sex, stu2.weight, stu2.score)
        var stu3 = new Student("130")
        stu3.sayHi()
        console.log(stu3.name, stu3.age, stu3.sex, stu3.weight, stu3.score)

原型继承: 为了数据共享,改变原型指向,做到了继承----通过改变原型指向实现的继承
缺陷:因为改变原型指向的同时实现继承,直接初始化了属性,继承过来的属性的值都是一样的了,所以,这就是问题
只能重新调用对象的属性进行重新赋值
解决方案:继承的时候,不用改变原型的指向,直接调用父级的构造函数的方案来为属性赋值就可以了-----借用构造函数:把要继承的父级的构造函数拿过来,使用一下就可以了。

借用构造函数继承

function Person(name, age, sex, weight) {
            this.name = name
            this.age = age
            this.sex = sex
            this.weight = weight
        }
        Person.prototype.sayHi = function() {
            console.log("您好");

        }

        function Student(name, age, sex, weight, score) {
            //借用构造函数
            Person.call(this, name, age, sex, weight)
            this.score = score
        }

        var stu1 = new Student("小明", 10, "男", "50kg", "100")
        console.log(stu1.name, stu1.age, stu1.sex, stu1.weight, stu1.score)
        var stu2 = new Student("小红", 10, "女", "50kg", "120")
        console.log(stu2.name, stu2.age, stu2.sex, stu2.weight, stu2.score)
        var stu3 = new Student("小绿", 10, "男", "50kg", "130")
        console.log(stu3.name, stu3.age, stu3.sex, stu3.weight, stu3.score)
    借用构造函数:构造函数名字.call(当前对象,属性,属性,属性....);
    解决了属性继承,并且值不重复的问题
    缺陷:父级类别中的方法不能继承

组合继承


        function Person(name, age, sex) {
            this.name = name
            this.age = age
            this.sex = sex

        }
        Person.prototype.sayHi = function() {
            console.log("你好呀");
        }

        function Student(name, age, sex, score) {
            //借用构造函数
            Person.call(this, name, age, sex)
            this.score = score
        }
        //改变原型指向----继承
        Student.prototype = new Person() //不传值
        Student.prototype.eat = function() {
            console.log("吃东西");

        }
        var stu = new Student("小白", 20, "男", "100分")
        console.log(stu.name, stu.age, stu.sex, stu.score);
        stu.sayHi()
        stu.eat()
        var stu1 = new Student("小黑", 22, "女", "120分")
        console.log(stu1.name, stu1.age, stu1.sex, stu1.score);
        stu1.sayHi()
        stu1.eat()
            //属性和方法都被继承了
组合继承:原型继承+借用构造函数继承
 属性和方法都被继承了
因此,组合继承是结合了原型继承和借用构造函数继承,所以组合继承更适用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值