Javascript定义类(class)的老三栽方式

 

 

以面向对象编程中,类(class)是目标(object)的模版,定义了同一组对象(又如”实例”)共有的性能和艺术。

Javascript语言不支持”类”,但是可为此有转之计,模拟出”类”。

无异于、构造函数法

随即是经方法,也是教科书必教的方式。它因此构造函数模拟”类”,在那个中间用this关键字指代实例对象。

  function Cat() {

    this.name = “大毛”;

  }

变更实例的早晚,使用new关键字。

  var cat1 = new Cat();

  alert(cat1.name); // 大毛

恍如的性能和章程,还可以定义在构造函数的prototype对象之上。

  Cat.prototype.makeSound = function(){

    alert(“喵喵喵”);

  }

有关这种措施的详细介绍,请圈自己写的文山会海文章《Javascript
面向对象编程》,这里就是不多说了。它的关键症结是,比较复杂,用到了this和prototype,编写和阅读都大讨厌。

二、Object.create()法

为化解”构造函数法”的先天不足,更便于地转移对象,Javascript的国际标准ECMAScript第五版(目前通行的凡第三版本),提出了一个初的章程Object.create()。

就此之法子,”类”就是一个靶,不是函数。

  var Cat = {

    name: “大毛”,

    makeSound: function(){ alert(“喵喵喵”); }

  };

下一场,直接用Object.create()生成实例,不欲以new。

  var cat1 = Object.create(Cat);

  alert(cat1.name); // 大毛

  cat1.makeSound(); // 喵喵喵

眼下,各大浏览器的时髦版本(包括IE9)都配置了之方法。如果遇老式浏览器,可以就此脚的代码自行安排。

  if (!Object.create) {

    Object.create = function (o) {

       function F() {}

      F.prototype = o;

      return new F();

    };

  }

这种艺术较”构造函数法”简单,但是非克落实个人属性与私家方法,实例对象期间吧不能够共享数据,对”类”的拟不够健全。

老三、极简主义法

荷兰程序员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(); // 啦啦啦

(完)