zoukankan      html  css  js  c++  java
  • JavaScript模拟"类"的三种方法

    一、构造函数法(最常用)

    
    
       function Cat() {
            this.name = "大毛";
        }
      var cat1 = new Cat();
      console.log(cat1.name); // 大毛

    主要缺点是,比较复杂,用到了this和prototype,编写和阅读都很费力

    二、Object.create()法(ES5特性)

    
    
       var Cat = {
        name: "大毛",
        makeSound: function(){console.log("喵喵喵");}
      };
      var cat1 = Object.create(Cat);
      console.log(cat1.name); // 大毛
      cat1.makeSound(); // 喵喵喵

    三、极简主义法(在对象里定义一个构造函数,返回实例)

    1.封装

    
    
     var Cat = {
        createNew: function(){
          var cat = {
                    name:"大毛",
                    makeSound:function(){console.log("喵喵喵");}
                };
          return cat;
        }
        };
       var cat1 = Cat.createNew();
      cat1.makeSound(); // 喵喵喵

    2.继承

    
    
      var Animal = {
        createNewAnimal: function(){
          var animal = {
                    sleep:function(){ console.log("睡懒觉"); }
                };
          return animal;
        }
      };
      var Cat = {
        createNewCat: function(){
          var cat = Animal.createNewAnimal();
          cat.name = "大毛";
          cat.makeSound = function(){ console.log("喵喵喵"); };
          return cat;
        }
      };
       var cat1 = Cat.createNewCat();
      cat1.sleep(); // 睡懒觉

    3.私有变量和方法(在createNew()方法中,只要不是定义在cat对象上的方法和属性,都是私有的,无法读取。)

    
    
        var sound="哈哈哈";
      var Cat = {
        createNew: function(){
                sound="喵喵喵";
          var cat = {
                    makeSound:function(){ console.log(sound); }
                };
          return cat;
        }
      };
      var cat1 = Cat.createNew();
        cat1.makeSound();//喵喵喵
      console.log(cat1.sound); // undefined
        console.log(cat1.makeSound);//function (){ console.log(sound); }

    4.数据共享(只要把这个内部数据,封装在类对象的里面、createNew()方法的外面即可)

    
    
        var Cat = {
        sound : "喵喵喵",
        createNew: function(){
          var cat = {
                    makeSound:function(){ console.log(Cat.sound); },
                    changeSound:function(x){ Cat.sound = x; }
                };
          return cat;
        }
      };
      var cat1 = Cat.createNew();
      var cat2 = Cat.createNew();
      cat1.makeSound(); // 喵喵喵
      cat2.changeSound("啦啦啦");
      cat1.makeSound(); // 啦啦啦

     

  • 相关阅读:
    avcodec_decode_video2少帧问题
    什么是I帧,P帧,B帧
    让Ubuntu可以压缩/解压缩RAR文件
    Linux 向文件末尾追加命令
    valgrind: failed to start tool 'memcheck' for platform 'amd64-linux': No such file or directory
    《王者之剑2》性能数据精讲
    Unity加载模块深度解析(纹理篇)
    Unity加载模块深度解析(Shader)
    Unity加载模块深度解析(网格篇)
    Unity将来时:IL2CPP是什么?
  • 原文地址:https://www.cnblogs.com/shen076/p/6558889.html
Copyright © 2011-2022 走看看