zoukankan      html  css  js  c++  java
  • 面向对象的封装、继承、多态以及构造函数

    1、面向对象特点:封装、继承、多态。
    2、构造函数 = 构造器 + 原型对象;
    (1)父类
    function UserClass(name,age,word){
      //构造器 constructor
      this.name=name;
      this.age =age;
      this.word =word;
      this.init =function(){
        return `${this.name} ----init初始化`;
      }
    }
    UserClass.prototype={
      //原型对象 prototype 只能实例化之后才能调取
      say(){
        return `${this.name}---${this.age}----${this.word}`;
      }
    }
    module.exports = UserClass;

    var u1 = new UserClass("大雷",18,"你们这些二傻子");
    打印:你们这些二傻子 -- 大雷 -- init初始化

    (2)子类
    继承父类:call/apply 改变this指向来实现继承,两者参数不相同,功能相同。但无法继承原型对象。
    var UserClass=require("./userClass");
    function User(name,age,word,grade){
      this.grade=grade;
      //UserClass.call(this,name,age,word);
      UserClass.apply(this,[name,age,word]);
    }

    //(1)直接赋值:可以继承原型对象
    //User.prototype = new UserClass();
    //(2)对象复制:可以继承原型对象
    //for(var i in UserClass.prototype){
    // User.prototype[i] = UserClass.prototype[i];
    // }

    User.prototype={
      say(){ //把父类的say方法改写叫方法重载。
        return `${this.name} 说:我好累`;
    },
      walk(){ //添加属于自己的方法叫多态。
        return "i am fly";
      }
    }
    module.exports = User;

    var u2 = new User("小明",22,"不存在的啊",100);


    补充知识点:
    var person = {
      username: "人类",
      say: function () {
        alert(this.username + "你好");
      }
    }

    var yellowPerson = {
      __proto__: person,
      username: "黄种人",
    };
    (1)Object.prototype.username = "地球人";//可以使用大写的Object来实现继承
    (2)yellowPerson.constructor.prototype === Object.prototype 结果为true
    注意:yellowPerson.prototype.username = "地球人"; 普通对象不能使用原型来继承
    打印: yellowPerson.say();

    普通函数的继承call和apply:
    <script>
    window.username = "lili";
    var person = {
      username: "leson"
      function say(userage,hobby) {
      alert(this.username + "今年" + userage + "岁喜欢"+hobby);
    }

    say.call(person, 18,"篮球");//say里面的this 指向call里面的第一个参数
    </script>

    <script>
    window.username = "lili";
    var person = {
      username: "leson"
    }
    function say(userage,hobby) {
      alert(this.username + "今年"+userage+"岁喜欢"+hobby);
    }
    say.apply(person,[18,"篮球"]);//say里面的this 指向apply里面的第一个参数
    </script>

    三种继承方式:
    构造函数 使用原型
    普通对象 使用内部原型
    普通函数 使用call/apply

    构造函数:使用的时候用new关键字实例化的函数
    1、构造函数就是一个类(object) 可以有属性和方法 里面的this就指向该构造函数
    2、构造函数可以通过prototype来实现继承(补充自身扩展更多内容)
    3、继承的时候就会产生原型链 自身-原型-Object Object没有就是undefined Object就是原型链的末端

    this的指向问题:函数属于谁就指向谁
    1 window 当函数直接调用的时候 函数名前面什么都没有的时候 say();
    2 object 指向函数的所有者 btn.onclick = function(){ }
    3 构造函数 new Say() this就指向构造函数
    4 call/apply里面的第一个参数


  • 相关阅读:
    eclipse export runnable jar(导出可执行jar包) runnable jar可以执行的
    mave常用指令
    771. Jewels and Stones珠宝数组和石头数组中的字母对应
    624. Maximum Distance in Arrays二重数组中的最大差值距离
    724. Find Pivot Index 找到中轴下标
    605. Can Place Flowers零一间隔种花
    581. Shortest Unsorted Continuous Subarray连续数组中的递增异常情况
    747. Largest Number At Least Twice of Others比所有数字都大两倍的最大数
    643. Maximum Average Subarray I 最大子数组的平均值
    414. Third Maximum Number数组中第三大的数字
  • 原文地址:https://www.cnblogs.com/lishixiang-007/p/11273473.html
Copyright © 2011-2022 走看看