JavaScript 实现类的多种方法实例

  构造方法

  

复制代码 代码如下:

  function coder()

  {

  this.name = '现代魔法';

  this.job = 'Web 开发者';

  this.coding = function ()

  { alert('我正在写代码'); }

  }

  var coder = new coder();

  alert(coder.name);

  coder.coding();

  工厂方法

  

复制代码 代码如下:

  function createCoderFactory()

  {

  var obj = new Object();

  obj.name = '现代魔法';

  obj.job = '程序员';

  obj.coding = function ()

  {

  alert('我正在写代码');

  };

  return obj;

  }

  var coder = createCoderFactory();

  alert(coder.name);

  coder.coding();

  工厂方法和构造方法都有着一个相同的缺点,就是每创建一个实例,都会实例化该类的每个函数。

  原型链

  

复制代码 代码如下:

  function coder(){}

  coder.prototype.name = '现代魔法';

  coder.prototype.job = '程序员';

  coder.prototype.coding = function(){

  alert('我正在写代码');

  };

  var coder = new coder();

  alert(coder.name);

  coder.coding();

  原型链有个缺点就是它所有属性都共享,只要一个实例改变其他的都会跟着改变。如:

  

复制代码 代码如下:

  var coder1 = new coder();

  var coder2 = new coder();

  alert(coder1.name);     /*显示现代魔法*/

  coder2.name = 'nowamagic';

  alert(coder1.name);     /*显示nowamagic*/

  alert(coder2.name);     /*这个也显示nowamagic*/

  混合方式

  以上三种都有着各自的缺点,所以我们要加以改进。

  

复制代码 代码如下:

  function coder()

  {

  this.name = '现代魔法';

  this.job = '程序员';

  }

  coder.prototype.coding = function(){

  alert('我正在写代码');

  };

  动态原链

  要解决前三种的缺点,还有一种方法。

  

复制代码 代码如下:

  function coder()

  {

  this.name = '现代魔法';

  this.job = '程序员';

  if (typeof(coder._init) == 'undefined')

  {

  this.coding = function ()

  {

  alert('我正在写代码');

  };

  this._init = true;

  }

  }