• 面向对象的封装、继承、多态以及构造函数


    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里面的第一个参数


  • 相关阅读:
    [改善Java代码]在equals中使用getClass进行类型判断
    [改善Java代码]equals应该考虑null值的情景
    [改善Java代码]覆写equals方法时不要识别不出自己
    [改善Java代码] 推荐使用序列化实现对象的拷贝
    [改善Java代码]避免对象的浅拷贝
    [改善Java代码]让工具类不可实例化
    [改善Java代码]建议40:匿名类的构造函数很特殊
    [改善Java代码]使用匿名类的构造函数
    [改善Java代码]使用静态内部类提高封装性
    [改善Java代码]构造函数尽量简化
  • 原文地址:https://www.cnblogs.com/lishixiang-007/p/11273473.html
Copyright © 2020-2023  润新知