zoukankan      html  css  js  c++  java
  • 继承

    对象是有属性和方法组成;
    |
    当我继承对象的时候,需要继承属性和方法。
    |
    继承:1,先执行父级的构造函数;2、添加子类的属性;3,添加方法
        function Person(name,sex) {
            this.name = name;
            this.sex = sex;
        }
        //    通过原型加方法;
        Person.prototype.showName = function () {
            console.log(this.name);
        }
        Person.prototype.showSex = function () {
            console.log(this.sex);
        }
        var a = new Person("wang","22");
        a.showName();
        a.showSex();
    //    在此基础上继承worker
        function Worker(name,sex,job) {
            Person.call(this,name,sex);//构造函数伪装,调用父级的构造函数(就是为了继承属性)。这里的this是new出来的worker对象
            this.job = job;//添加子类的属性
        }
        Worker.prototype = Person.prototype;//原型链,引用,通过原型来继承父级的方法。
        Worker.prototype.showJob = function () {
            console.log(this.job);
        }
        var b = new Worker("li","女","扫地的");
        b.showName();
        b.showSex();
        b.showJob();
        console.log(Person.prototype.showJob);//子类影响了父类的东西

    出现的问题,子类影响了父类的东西,这里就说到了引用。ex:

    引用:钥匙,同一块区域的地址
    记住,js里面所有的对象全是引用。
        var arr1 = [1,2,3];
        var arr2 = arr1;//配钥匙
        arr2.push(4);
        console.log(arr2);//1234
        console.log(arr1);//1234
    //如果我不希望是一个引用,我希望我修改arr2的时候,arr1不受影响,怎么做呢?ex:
        var arr1 = [1,2,3];
        var arr2 = [];
        for(var i in arr1){//把arr1里的东西复制一份到arr2中。
            arr2[i]=arr1[i];
        }
        arr2.push(4);
        console.log(arr2);//1234
        console.log(arr1);//123

    .call():调用一个对象的一个方法,以另一个对象替换当前对象.
    Person.call(this,name,sex);//构造函数伪装,调用父级的构造函数(就是为了继承属性)。这里的this是new出来的worker对象

    最终,继承代码改为:
        function Person(name,sex) {
            this.name = name;
            this.sex = sex;
        }
        //    通过原型加方法;
        Person.prototype.showName = function () {
            console.log(this.name);
        }
        Person.prototype.showSex = function () {
            console.log(this.sex);
        }
        var a = new Person("wang","22");
        a.showName();
        a.showSex();
        //    在此基础上继承worker
        function Worker(name,sex,job) {
            Person.call(this,name,sex);//用构造函数伪装,来继承父级的属性
            this.job = job;//添加子类的属性
        }
    
        for(var i in Person.prototype){
            Worker.prototype[i]=Person.prototype[i];//用原型链来继承父级的方法
        }
    
        Worker.prototype.showJob = function () {
            console.log(this.job);
        }
        var b = new Worker("li","女","扫地的");
        b.showName();
        b.showSex();
        b.showJob();
        console.log(Person.prototype.showJob);//undefind

    其中

    for(var i in Person.prototype){Worker.prototype[i]=Person.prototype[i];//用原型链来继承父级的方法}

    是复制了一份Person的方法到worker中。

    补充:instanceof

    instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。

    type of  :....的类型

    var arr1 = new Array()
    Array叫类,arr1叫实例。
    instance :实例,就是new出来的东西 ,是arr1
    所以,instance of :...的实例 作用:判断某个对象是否是某个类的实例
        var arr1 = [1,2,3];
        console.log(arr1 instanceof Array);//true
        console.log(arr1 instanceof Object);//true 所有的类都是Object的一个子类,从object继承来的

    
    
    

    总结: 一,用构造函数伪装,来继承父级的属性;二,添加子类的属性;三,用原型链来继承父级的方法。

  • 相关阅读:
    9、二叉排序树的创建、插入、遍历
    8、判断两个链表是否相交
    7、判断链表是否有环
    6、查找单链表中倒数第n个节点
    5、单链表的反转
    4、KMP(看毛片)算法
    3、希尔排序
    2、快速排序
    json字符串转为json对象
    json对象转化为字符串过程分析
  • 原文地址:https://www.cnblogs.com/wang715100018066/p/6051933.html
Copyright © 2011-2022 走看看