JavaScript不使用prototype和new实现继承机制

  此方法并非笔者原创,笔者只是在前辈的基础上,加以总结,得出一种简洁实用的JavaScript继承方法。

  传统的JavaScript继承基于prototype原型链,并且需要使用大量的new操作,代码不够简洁,可读性也不是很强,貌似还容易受到原型链污染。

  笔者总结的继承方式,简洁明了,虽然不是最好的方式,但希望能给读者带来启发。

  好了,废话不多说,直接看代码,注释详尽,一看就懂~~~

  

复制代码 代码如下:

  /**

  * Created by 杨元 on 14-11-11.

  * 不使用prototype实现继承

  *

  */

  /**

  * Javascript对象复制,仅复制一层,且仅复制function属性,不通用!

  * @param obj  要复制的对象

  * @returns  Object

  */

  Object.prototype.clone = function(){

  var _s = this,

  newObj = {};

  _s.each(function(key, value){

  if(Object.prototype.toString.call(value) === "[object Function]"){

  newObj[key] = value;

  }

  });

  return newObj;

  };

  /**

  * 遍历obj所有自身属性

  *

  * @param callback 回调函数。回调时会包含两个参数: key 属性名,value 属性值

  */

  Object.prototype.each = function(callback){

  var key = "",

  _this = this;

  for (key in _this){

  if(Object.prototype.hasOwnProperty.call(_this, key)){

  callback(key, _this[key]);

  }

  }

  };

  /**

  * 创建子类

  * @param ext obj,包含需要重写或扩展的方法。

  * @returns Object

  */

  Object.prototype.extend = function(ext){

  var child = this.clone();

  ext.each(function(key, value){

  child[key] = value;

  });

  return child;

  };

  /**

  * 创建对象(实例)

  * @param arguments 可接受任意数量参数,作为构造器参数列表

  * @returns Object

  */

  Object.prototype.create = function(){

  var obj = this.clone();

  if(obj.construct){

  obj.construct.apply(obj, arguments);

  }

  return obj;

  };

  /**

  * Useage Example

  * 使用此种方式继承,避免了繁琐的prototype和new。

  * 但是目前笔者写的这段示例,只能继承父类的function(可以理解为成员方法)。

  * 如果想继承更丰富的内容,请完善clone方法。

  *

  *

  */

  /**

  * 动物(父类)

  * @type {{construct: construct, eat: eat}}

  */

  var Animal = {

  construct: function(name){

  this.name = name;

  },

  eat: function(){

  console.log("My name is "+this.name+". I can eat!");

  }

  };

  /**

  * 鸟(子类)

  * 鸟类重写了父类eat方法,并扩展出fly方法

  * @type {子类|void}

  */

  var Bird = Animal.extend({

  eat: function(food){

  console.log("My name is "+this.name+". I can eat "+food+"!");

  },

  fly: function(){

  console.log("I can fly!");

  }

  });

  /**

  * 创建鸟类实例

  * @type {Jim}

  */

  var birdJim = Bird.create("Jim"),

  birdTom = Bird.create("Tom");

  birdJim.eat("worm");  //My name is Jim. I can eat worm!

  birdJim.fly();  //I can fly!

  birdTom.eat("rice");  //My name is Tom. I can eat rice!

  birdTom.fly();  //I can fly!