JavaScript簡潔繼承機制實現(不使用prototype和new)

      此方法並不是筆者原創,筆者只是在前輩的基礎上,加以總結,得出一種簡潔實用的JavaScript繼承方法。app

      傳統的JavaScript繼承基於prototype原型鏈,而且須要使用大量的new操做,代碼不夠簡潔,可讀性也不是很強,貌似還容易受到原型鏈污染。函數

      筆者總結的繼承方式,簡潔明瞭,雖然不是最好的方式,但但願能給讀者帶來啓發。this

      好了,廢話很少說,直接看代碼,註釋詳盡,一看就懂~~~spa

  1 /**
  2  * Created by 楊元 on 14-11-11.
  3  * 不使用prototype實現繼承
  4  *
  5  */
  6 
  7 /**
  8  * Javascript對象複製,僅複製一層,且僅複製function屬性,不通用!
  9  * @param obj  要複製的對象
 10  * @returns  Object
 11  */
 12 Object.prototype.clone = function(){
 13     var _s = this,
 14         newObj = {};
 15     _s.each(function(key, value){
 16         if(Object.prototype.toString.call(value) === "[object Function]"){
 17             newObj[key] = value;
 18         }
 19     });
 20     return newObj;
 21 };
 22 
 23 /**
 24  * 遍歷obj全部自身屬性
 25  *
 26  * @param callback 回調函數。回調時會包含兩個參數: key 屬性名,value 屬性值
 27  */
 28 Object.prototype.each = function(callback){
 29     var key = "",
 30         _this = this;
 31     for (key in _this){
 32         if(Object.prototype.hasOwnProperty.call(_this, key)){
 33             callback(key, _this[key]);
 34         }
 35     }
 36 };
 37 
 38 /**
 39  * 建立子類
 40  * @param ext obj,包含須要重寫或擴展的方法。
 41  * @returns Object
 42  */
 43 Object.prototype.extend = function(ext){
 44     var child = this.clone();
 45     ext.each(function(key, value){
 46         child[key] = value;
 47     });
 48     return child;
 49 };
 50 
 51 /**
 52  * 建立對象(實例)
 53  * @param arguments 可接受任意數量參數,做爲構造器參數列表
 54  * @returns Object
 55  */
 56 Object.prototype.create = function(){
 57     var obj = this.clone();
 58     if(obj.construct){
 59         obj.construct.apply(obj, arguments);
 60     }
 61     return obj;
 62 };
 63 
 64 
 65 /**
 66  * Useage Example
 67  * 使用此種方式繼承,避免了繁瑣的prototype和new。
 68  * 可是目前筆者寫的這段示例,只能繼承父類的function(能夠理解爲成員方法)。
 69  * 若是想繼承更豐富的內容,請完善clone方法。
 70  *
 71  *
 72  */
 73 
 74 /**
 75  * 動物(父類)
 76  * @type {{construct: construct, eat: eat}}
 77  */
 78 var Animal = {
 79     construct: function(name){
 80         this.name = name;
 81     },
 82     eat: function(){
 83         console.log("My name is "+this.name+". I can eat!");
 84     }
 85 };
 86 
 87 /**
 88  * 鳥(子類)
 89  * 鳥類重寫了父類eat方法,並擴展出fly方法
 90  * @type {子類|void}
 91  */
 92 var Bird = Animal.extend({
 93     eat: function(food){
 94         console.log("My name is "+this.name+". I can eat "+food+"!");
 95     },
 96     fly: function(){
 97         console.log("I can fly!");
 98     }
 99 });
100 
101 /**
102  * 建立鳥類實例
103  * @type {Jim}
104  */
105 var birdJim = Bird.create("Jim"),
106     birdTom = Bird.create("Tom");
107 
108 birdJim.eat("worm");  //My name is Jim. I can eat worm!
109 birdJim.fly();  //I can fly!
110 
111 birdTom.eat("rice");  //My name is Tom. I can eat rice!
112 birdTom.fly();  //I can fly!
相關文章
相關標籤/搜索