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(); // 啦啦啦

 

 

 

 

posted @ 2017-03-16 12:40  森森森shen  阅读(308)  评论(0编辑  收藏  举报