js的子類繼承父類

在很多時(shí)候我們寫的js操作都有很多的公用的地方,每次都去復(fù)制過來蛮放,代碼復(fù)用性很差缩抡,為何不像java一樣,將公共的一些操作包颁,屬性提取出來作為父類瞻想,然后子類去繼承并繼續(xù)做加工,不影響父類娩嚼。

下面我來介紹下js的類的三種繼承的寫法

拷貝繼承:(通用型的 有new或無new的時(shí)候都可以)

  • 繼承屬性用父類的call方法

      父類.call(this,屬性1,屬性2,....);
    
  • 繼承方法用for in

      extend(子類的原型,父類的原型);
      
      //for in 繼承  jq也是這種 繼承方法
      function extend(obj1, obj2){
        for(var attr in obj2){
              obj1[attr] = obj2[attr];
        }
      }        
    
  • 先看這個(gè)簡(jiǎn)單的例子蘑险,理解js的繼承:

      <!DOCTYPE html>
      <html>
        <head>
          <meta charset="utf-8">
          <title>myTest</title>
        </head>
        <body>
          <script type="text/javascript">
            function CreatePerson(name,sex){
              this.name = name;
              this.sex = sex;
            }//父類構(gòu)造器,定義父類的屬性
            CreatePerson.prototype.showName = function(){
              alert(this.name);
            }//利用原型給寫父類的方法屬性
            var p1 = new CreatePerson('小明', 'boy');//實(shí)例化父類測(cè)試是否成功
            p1.showName();//小明
      
            //屬性的繼承采用的是調(diào)用父類的構(gòu)造器的call
            function CreateStar(name, sex,job){
                CreatePerson.call(this,name,sex);
                this.job = job;
            }
      
            //將父類的原型給子類(更改一個(gè)都改變岳悟,這里相當(dāng)于引用佃迄,而不是復(fù)制泼差,這種是做不到繼承的)
            // CreateStar.prototype=CreatePerson.prototype;
      
            extend(CreateStar.prototype,CreatePerson.prototype);
      
      //for in 繼承  jq也是這種 繼承方法
            function extend(obj1, obj2){
                for(var attr in obj2){
                  obj1[attr] = obj2[attr];
                }
            }
      
            var p2 = new CreateStar('xiaolki','girl','papa');
            p2.showName();
            p1.showName();
          </script>
        </body>
      </html>
    
  • 下面給出一段js拖動(dòng)div的操作的繼承

    1. 寫父類對(duì)div1進(jìn)行拖動(dòng)的操作,及父類

       function Drag(id) {  //父類
           this.obj = document.getElementById(id);//獲取所要拖動(dòng)的dom節(jié)點(diǎn)
           this.disX = 0;
           this.disY = 0;
       }
       Drag.prototype.init = function () {
      
           var This = this;
      
           //鼠標(biāo)按下事件初始化
           this.obj.onmousedown = function (ev) {
               var ev = ev || window.event;
               This.fnDown(ev);
               
               //鼠標(biāo)移動(dòng)事件初始化
               document.onmousemove = function (ev) {
                   var ev = ev || window.event;
                   This.fnMove(ev);
               };
               
               //鼠標(biāo)松開事件初始化
               document.onmouseup = function () {
                   This.fnUp();
               };
               return false;
           };
      
       };
      
       //鼠標(biāo)按下操作
       Drag.prototype.fnDown = function (ev) {
           this.disX = ev.clientX - this.obj.offsetLeft;
           this.disY = ev.clientY - this.obj.offsetTop;
       };
      
       //鼠標(biāo)移動(dòng)操作
       Drag.prototype.fnMove = function (ev) {
           this.obj.style.left = ev.clientX - this.disX + 'px';
           this.obj.style.top = ev.clientY - this.disY + 'px';
       };
      
       //鼠標(biāo)松開操作
       Drag.prototype.fnUp = function () {
           document.onmousemove = null;
           document.onmouseup = null;
       };
      
  1. 子類繼承父類

     function ChildDrag(id) {   //子類
         Drag.call(this, id);//繼承父類的屬性
     }
    
     //繼承父類的方法
     extend(ChildDrag.prototype, Drag.prototype);
    
     //子類重寫父類的鼠標(biāo)移動(dòng)方法
     ChildDrag.prototype.fnMove = function (ev) {
    
         var L = ev.clientX - this.disX;
         var T = ev.clientY - this.disY;
    
         if (L < 0) {
             L = 0;
         }
         else if (L > document.documentElement.clientWidth - this.obj.offsetWidth) {
             L = document.documentElement.clientWidth - this.obj.offsetWidth;
         }
    
         this.obj.style.left = L + 'px';
         this.obj.style.top = T + 'px';
     };
    
     //for in 來繼承父類的方法
     function extend(obj1, obj2) {
         for (var attr in obj2) {
             obj1[attr] = obj2[attr];
         }
     }
    

類似繼承: (new構(gòu)造函數(shù))

JS是沒有類的概念的 , 把JS中的構(gòu)造函數(shù)看做的類

要做屬性和方法繼承的時(shí)候呵俏,要分開繼承

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>無標(biāo)題文檔</title>
<script>

function Aaa(){   //父類
    this.name = [1,2,3];
}

Aaa.prototype.showName = function(){
    alert( this.name );
};

function Bbb(){   //子類
    Aaa.call(this);
}

var F = function(){};
F.prototype = Aaa.prototype;//利用空方法只繼承父類的方法堆缘,不繼承屬性
Bbb.prototype = new F();//將繼承來的方法給子類引用
Bbb.prototype.constructor = Bbb; //因?yàn)槭菑母割愐枚鴣恚砸匦滦拚赶騿栴}

var b1 = new Bbb();
//b1.showName();
//alert( b1.name );
//alert( b1.constructor );
b1.name.push(4);

var b2 = new Bbb();

alert( b2.name );

</script>
</head>

<body>
</body>
</html>

原型繼承:(無new對(duì)象)

<!DOCTYPE HTML>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>無標(biāo)題文檔</title>
    <script>

        var a = {
            name: '小明'
        };

        var b = cloneObj(a);

        b.name = '小強(qiáng)';

        //alert( b.name );
        alert(a.name);

        function cloneObj(obj) {

            var F = function () {
            };

            F.prototype = obj;

            return new F();

        }

    </script>
</head>

<body>
</body>
</html>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末普碎,一起剝皮案震驚了整個(gè)濱河市吼肥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌麻车,老刑警劉巖缀皱,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異动猬,居然都是意外死亡啤斗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門枣察,熙熙樓的掌柜王于貴愁眉苦臉地迎上來争占,“玉大人,你說我怎么就攤上這事序目”酆郏” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵猿涨,是天一觀的道長(zhǎng)握童。 經(jīng)常有香客問我,道長(zhǎng)叛赚,這世上最難降的妖魔是什么澡绩? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮俺附,結(jié)果婚禮上肥卡,老公的妹妹穿的比我還像新娘。我一直安慰自己事镣,他們只是感情好步鉴,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著璃哟,像睡著了一般氛琢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上随闪,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天阳似,我揣著相機(jī)與錄音,去河邊找鬼铐伴。 笑死撮奏,一個(gè)胖子當(dāng)著我的面吹牛俏讹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挽荡,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼藐石,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了定拟?” 一聲冷哼從身側(cè)響起于微,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎青自,沒想到半個(gè)月后株依,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡延窜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年恋腕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逆瑞。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡荠藤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出获高,到底是詐尸還是另有隱情哈肖,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布念秧,位于F島的核電站淤井,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏摊趾。R本人自食惡果不足惜币狠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望砾层。 院中可真熱鬧漩绵,春花似錦、人聲如沸肛炮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)铸董。三九已至祟印,卻和暖如春肴沫,著一層夾襖步出監(jiān)牢的瞬間粟害,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工颤芬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留悲幅,地道東北人套鹅。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像汰具,于是被迫代替她去往敵國(guó)和親卓鹿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品留荔,去做同樣的事情吟孙,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式。簡(jiǎn)單...
    舟漁行舟閱讀 7,724評(píng)論 2 17
  • 單例模式 適用場(chǎng)景:可能會(huì)在場(chǎng)景中使用到對(duì)象聚蝶,但只有一個(gè)實(shí)例杰妓,加載時(shí)并不主動(dòng)創(chuàng)建,需要時(shí)才創(chuàng)建 最常見的單例模式碘勉,...
    Obeing閱讀 2,058評(píng)論 1 10
  • 如果不了解js的繼承的寫法巷挥,可以先去看看我之前寫的js的子類繼承父類文章http://www.jianshu.co...
    GQ1994閱讀 2,419評(píng)論 0 3
  • 面向?qū)ο?類,原型验靡,實(shí)例三者打交道 類里面存放的都是私有屬性和方法 原型prototype上存的都是公有的屬性和方...
    Dream_丹丹閱讀 319評(píng)論 0 0
  • @轉(zhuǎn)自GitHub 介紹js的基本數(shù)據(jù)類型倍宾。Undefined、Null胜嗓、Boolean高职、Number、Strin...
    YT_Zou閱讀 1,145評(píng)論 0 0