zoukankan      html  css  js  c++  java
  • 我喜欢的两个js类实现方式 现在再加上一个 极简主义法

    闭包实现 变量是不会变的:) 

     1 var myApplication = function(){
     2   var name = 'Yuri';
     3   var age = '34';
     4   var status = 'single';
     5   function createMember(){
     6     name='Yuri2';
     7   }
     8   function getMemberDetails(){
     9     return name;
    10   }
    11   return{
    12     create:createMember,
    13     get:getMemberDetails,
    14     name:name
    15   }
    16 }();
    17 myApplication.create();
    18 alert(myApplication.get());
    19 alert(myApplication.name);

    非闭包 (每一次运行方式都 会修改代码)

     1 var xxxx={
     2     name:'xxxx',
     3     get:function(){
     4         return this.name;    
     5     },
     6     set:function(name){
     7         this.name=name    
     8     }
     9 }
    10 alert(xxxx.name);
    11 alert(xxxx.get());
    12 xxxx.set('test')
    13 
    14 alert(xxxx.get());
    15 alert(xxxx.name);

    极简主义法

    荷兰程序员Gabor de Mooij提出了一种比Object.create()更好的新方法,他称这种方法为"极简主义法"(minimalist approach)。这也是我推荐的方法。

    3.1 封装

    这种方法不使用this和prototype,代码部署起来非常简单,这大概也是它被叫做"极简主义法"的原因。

    首先,它也是用一个对象模拟"类"。在这个类里面,定义一个构造函数createNew(),用来生成实例。

      var Cat = {

        createNew: function(){

          // some code here

        }

      };

    然后,在createNew()里面,定义一个实例对象,把这个实例对象作为返回值。

      var Cat = {

        createNew: function(){

          var cat = {};

          cat.name = "大毛";

          cat.makeSound = function(){ alert("喵喵喵"); };

          return cat;

        }

      };

    使用的时候,调用createNew()方法,就可以得到实例对象。

      var cat1 = Cat.createNew();

      cat1.makeSound(); // 喵喵喵

    这种方法的好处是,容易理解,结构清晰优雅,符合传统的"面向对象编程"的构造,因此可以方便地部署下面的特性。

    3.2 继承

    让一个类继承另一个类,实现起来很方便。只要在前者的createNew()方法中,调用后者的createNew()方法即可。

    先定义一个Animal类。

      var Animal = {

        createNew: function(){

          var animal = {};

          animal.sleep = function(){ alert("睡懒觉"); };

          return animal;

        }

      };

    然后,在Cat的createNew()方法中,调用Animal的createNew()方法。

      var Cat = {

        createNew: function(){

          var cat = Animal.createNew();

          cat.name = "大毛";

          cat.makeSound = function(){ alert("喵喵喵"); };

          return cat;

        }

      };

    这样得到的Cat实例,就会同时继承Cat类和Animal类。

      var cat1 = Cat.createNew();

      cat1.sleep(); // 睡懒觉

    3.3 私有属性和私有方法

    在createNew()方法中,只要不是定义在cat对象上的方法和属性,都是私有的。

      var Cat = {

        createNew: function(){

          var cat = {};

          var sound = "喵喵喵";

          cat.makeSound = function(){ alert(sound); };

          return cat;

        }

      };

    上例的内部变量sound,外部无法读取,只有通过cat的公有方法makeSound()来读取。

      var cat1 = Cat.createNew();

      alert(cat1.sound); // undefined

    3.4 数据共享

    有时候,我们需要所有实例对象,能够读写同一项内部数据。这个时候,只要把这个内部数据,封装在类对象的里面、createNew()方法的外面即可。

      var Cat = {

        sound : "喵喵喵",

        createNew: function(){

          var cat = {};

          cat.makeSound = function(){ alert(Cat.sound); };

          cat.changeSound = function(x){ Cat.sound = x; };

          return cat;

        }

      };

    然后,生成两个实例对象:

      var cat1 = Cat.createNew();

      var cat2 = Cat.createNew();

      cat1.makeSound(); // 喵喵喵

    这时,如果有一个实例对象,修改了共享的数据,另一个实例对象也会受到影响。

      cat2.changeSound("啦啦啦");

      cat1.makeSound(); // 啦啦啦

     1 var Animal = {
     2     init: function(){
     3       var animal = {
     4                     name:'heelo11111',
     5                     sleep:function(){ alert("睡懒觉");}
     6         
     7            };
     8       return animal;
     9     }
    10   };
    11 
    12 var Animal2 = {
    13     init: function(){
    14       var animal = {
    15                     name:'heelo222',
    16                     sleep2:function(){ alert("睡懒觉2");},
    17                     sleep22:function(){ alert("睡懒觉2");},
    18                     sleep23:function(){ alert("睡懒觉2");},
    19                     sleep24:function(){ alert("睡懒觉2");},
    20                     sleep25:function(){ alert("睡懒觉25");}
    21         
    22            };
    23       return animal;
    24     }
    25   };
    26 
    27 var Cat = {
    28        sound:"ekekekekekeekek",
    29     init: function(){
    30         var cat = Animal.init();
    31               var cat2 = Animal2.init();
    32         cat.name = "大毛";
    33         cat.makeSound = function(){ alert("喵喵喵"); };             
    34              //合并两个对象 如果原来有节点不重写
    35              for(var key in cat2){
    36                  console.log(key);
    37                 if(!cat[key]){
    38                     cat[key] = cat2[key];
    39                 }
    40              }
    41              //console.log(cat);
    42 
    43            var sound="private var";
    44            this.sound=sound;
    45       return cat;
    46     }
    47 };
    48 
    49 
    50 var cat=Cat.init();
    51 cat.sleep();
    52 cat.sleep25();
    53 console.log(cat);

     

  • 相关阅读:
    java线程简要
    Unable to find explicit activity class
    用NetBeans生成jar文件
    Linux下三个可以修改环境变量的地方
    linux定时执行shell脚本
    sql server 性能调优之 SQL语句阻塞查询
    sql server 性能调优之 死锁排查
    IObit Advanced SystemCare 系统清理优化工具
    IDEA配置Maven
    maven的生命周期及常用命令的使用
  • 原文地址:https://www.cnblogs.com/yuri2016/p/5848163.html
Copyright © 2011-2022 走看看