物件的繼承(二)--複製屬性的第一種方法

物件的繼承(二)--複製屬性的第一種方法:

上次我們在物件的繼承中提到使用原型(prototype)來進行繼承,而使用原型繼承的特點就是屬性的共享,這很好,但是也有不對時的時候,總是有些時候我們希望繼承一些屬性,但卻不願意和人共享。譬如說我有個creature物件,我想要繼承他的name屬性,但我總不能跟別人共享這name屬性吧。

把這想法畫成圖形大概就會像下面這圖:我希望能繼承一些屬性或是方法,而且專屬於自己的物件,譬如creature中的creature_type。還有一些屬性或方法是單單存在於自己的物件之中,譬如human中的angrymode。這種做法的好處是,有些通用的屬性要被額外加入時,不需要修改每個建構函式,只需要修改被繼承的物件就可以了。

javascript_copy_inherit

要達到這樣的目的,有一種作法是將creature獨立寫成一個函式,然後在human與dragon的建構函式中使用call或是apply來呼叫他,這樣可以讓我們直接複製creature中的所有屬性而且不會共享。現在我們用一個範例來看看這如何實踐:

<script type="text/javascript">
function creature(){//定義creature
  var creature_type="";  //私有屬性
  var name="";
  var hp="";
  this.age=0;            //公開屬性
  this.setCreature_type=function(c){
    creature_type=c.toString();  
  }
  this.getCreature_type=function(){
    return creature_type;
  }
  this.setName=function(s){
      name=s.toString();
  }
  this.getName=function(){
    return name;
  }
}
function human(name){   //human建構函式
  creature.call(this);  //在human的建構函式中呼叫creature.call(this)
  this.setCreature_type("人類");
  this.setName(name);
  this.angrymode=function(){    //專屬於human的方法
    //do something
  }
}
function dragon(name){  //dragon建構函式 
  creature.call(this);  //在dragon的建構函式中呼叫creature.call(this)
  this.setCreature_type("龍族");
  this.setName(name);
  this.magic_invalid=function(){   //專屬於dragon的方法
    //do something
  }
}
var player1=new human("維克");
var dragonnNPC1=new dragon("維多利亞");
alert("種族:"+player1.getCreature_type()+"  姓名:"+player1.getName());
//輸出: 種族:人類  姓名:維克
alert("種族:"+dragonnNPC1.getCreature_type()+"  姓名:"+dragonnNPC1.getName());
//輸出: 種族:龍族  姓名:維多利亞
</script>

從結果來看很明顯就能發現human與dragon都各自繼承了creature中定義的屬性。而且不會互相干擾。如果仔細想想還會發現,這種做法可以模擬出多重繼承的特性。只要簡單的在建構函式中使用function.call(this)就能繼承其他物件的屬性。簡單好用。

inherit_player1

 
 

  按個讚!~支持本站!~

FB推薦載入中