JS高级2面向对象继承

一,原型的指向可以发生改变

function person(){
}
function stu(){
}
stu.prototype=new person()
//原型的指向可以发生改变

二,原型继承

  //原型继承(改变原型的指向)
    //目的:让学生去继承人的属性和方法(构造函数中的属性和方法  原型上的属性的方法)
    //人构造函数中的属性和方法
    function person(name, age) {
        this.age = age
        this.name = name
        this.say = function () {
            console.log(this.name + "会睡觉");
        }
    }
    //人原型的属性和方法
    person.prototype.sex = "男"
    person.prototype.sleep = function () {
        console.log((this.name + "会睡觉"));
    }
    //学生构造函数中的属性和方法
    function student(code) {
        this.code = code
        this.study = function () {
            console.log(this.name + "热爱学习");
        }
    }
    //改变原型的指向(学生原型上的属性和方法要放在实例化后面)
    student.prototype = new person("小明", 22)
    var stu = new student(100)
    student.prototype.height = 200
    student.prototype.play = function () {
        console.log("热爱游戏");
    }
    //学生构造函数中的属性和方法
    console.log(stu.code);
    stu.study()
    // 学生原型的属性和方法
    console.log(stu.height);
    stu.play()
    // 人构造函数中的属性和方法
    console.log(stu.name);
    stu.say()
    // 人原型的属性和方法
    console.log(stu.sex);
    stu.sleep()

三,构造继承

 //构造继承 (call()  去改变this的指向)只能是构造函数
    // 目的:让学生去继承人的属性和方法(构造函数中的属性和方法  原型上的属性的方法)
    //人构造函数中的属性和方法
    function person(name, age) {
        this.age = age
        this.name = name
        this.say = function () {
            console.log(this.name + "会睡觉");
        }
    }
    //人原型的属性和方法
    person.prototype.sex = "男"
    person.prototype.sleep = function () {
        console.log((this.name + "会睡觉"));
    }
    //学生构造函数中的属性和方法
    function student(code, name, age) {
        this.code = code
        this.study = function () {
            console.log(this.name + "热爱学习");
        }
        /*在学生的构造函数中,this指向学生的实例化对象stu,所以stu有了学生构造函数中的属性和方法
        在人的构造函数中,this指向人的实例化对象per,所以per有了人的构造函数中的属性和方法
        
        在人的构造函数中,this指向学生的实例化对象stu,所以有了人构造函数中的属性和方法
        */
        person.call(this, name.age)
    }
    //还需要原型继承
    student.prototype = new person()
    var stu = new student(100, "xiaoming", 18)
    //学生原型上的属性和方法
    student.prototype = new person("小明", 22)

    student.prototype.height = 200
    student.prototype.play = function () {
        console.log("热爱游戏");
    }

四,深拷贝与浅拷贝

1. javascript的变量的存储方式:栈(stack)和堆(heap)。

    栈:自动分配内存空间,系统自动释放,里面存放的是基本类型的值和引用类型的地址
    堆:动态分配的内存,大小不定,也不会自动释放。里面存放引用类型的值。

2.基本类型:赋值 赋真正的值。 引用类型:赋引用类型的地址

  var num = 10
    var age = 10
    console.log(num == age);//true
    var arr = [1, 2, 3]
    var arr1 = [1, 2, 3]
    console.log(arr == arr1);//false
    /*深拷贝相对于引用类型来说:传的地址*/
    //数组
    var arr1=[1,2,3]
    var arr2= arr1
    arr2.push(4)
    console.log(arr1);
    console.log(arr2);
    //深拷贝 传的值
    //1.for循环
    var arr3=[1,2,3]
    var arr4=[]
    for(var i=0;i<arr3.length;i++){
        arr4.push(arr3[i])
    }
    arr4.unshift(0)
    console.log(arr3);
    console.log(arr4);//深拷贝 传的值
    //2.slice()
    var arr5=[1,2,3]
    var arr6=arr5.slice(0)
    arr6.shift()
    console.log(arr5);
    console.log(arr6);//深拷贝 传的值
    //3.concat()
    var arr7=[1,2,3]
    var arr8=arr7.concat()
    arr8.pop()
    console.log(arr7);
    console.log(arr8);//深拷贝
    //对象 深拷贝
    var obj1={
        name:"obj1",
        age: 18
    }
    var obj2={ }
        for(x in obj1){
            obj2[x]=obj1[x]
        }
        console.log(obj1);
    console.log(obj2);

五,拷贝继承

 // 拷贝继承  (对象的深拷贝)
    // 目的:让学生去继承人的属性和方法(构造函数中的属性和方法  原型上的属性的方法)
    //人构造函数中的属性和方法
    function person(name, age) {
        this.age = age
        this.name = name
        this.say = function () {
            console.log(this.name + "会睡觉");//小明会睡觉
        }
    }
    //人原型的属性和方法
    person.prototype.sex = "男"
    person.prototype.sleep = function () {
        console.log((this.name + "会睡觉"));//小明会睡觉
    }
    //学生构造函数中的属性和方法
    function student(code) {
        this.code = code
        this.study = function () {
            console.log(this.name + "热爱学习");//小明热爱学习
        }
    }
    //学生原型上的属性和方法
    student.prototype = new person("小明", 22)
 
    student.prototype.height = 200
    student.prototype.play = function () {
        console.log("热爱游戏");
    }
    var stu = new student(100)
    var per = new person("小明",17)
    for (x in per) {
        stu[x] = per[x]
    }
     // 学生构造函数中的属性和方法
     console.log(stu.code);//100
    stu.study()
    // 学生原型的属性和方法
    console.log(stu.height);//200
    stu.play()
    // 人构造函数中的属性和方法
    console.log(stu.name);//小明
    stu.say()
    // 人原型的属性和方法
    console.log(stu.sex);//男
    stu.sleep()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值