js的子类继承父类

在很多时候我们写的js操作都有很多的公用的地方,每次都去复制过来,代码复用性很差,为何不像java一样,将公共的一些操作,属性提取出来作为父类,然后子类去继承并继续做加工,不影响父类。

下面我来介绍下js的类的三种继承的写法

拷贝继承:(通用型的 有new或无new的时候都可以)

  • 继承属性用父类的call方法

      父类.call(this,属性1,属性2,....);
    
  • 继承方法用for in

      extend(子类的原型,父类的原型);
      
      //for in 继承  jq也是这种 继承方法
      function extend(obj1, obj2){
        for(var attr in obj2){
              obj1[attr] = obj2[attr];
        }
      }        
    
  • 先看这个简单的例子,理解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;
            }//父类构造器,定义父类的属性
            CreatePerson.prototype.showName = function(){
              alert(this.name);
            }//利用原型给写父类的方法属性
            var p1 = new CreatePerson('小明', 'boy');//实例化父类测试是否成功
            p1.showName();//小明
      
            //属性的继承采用的是调用父类的构造器的call
            function CreateStar(name, sex,job){
                CreatePerson.call(this,name,sex);
                this.job = job;
            }
      
            //将父类的原型给子类(更改一个都改变,这里相当于引用,而不是复制,这种是做不到继承的)
            // 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拖动div的操作的继承

    1. 写父类对div1进行拖动的操作,及父类

       function Drag(id) {  //父类
           this.obj = document.getElementById(id);//获取所要拖动的dom节点
           this.disX = 0;
           this.disY = 0;
       }
       Drag.prototype.init = function () {
      
           var This = this;
      
           //鼠标按下事件初始化
           this.obj.onmousedown = function (ev) {
               var ev = ev || window.event;
               This.fnDown(ev);
               
               //鼠标移动事件初始化
               document.onmousemove = function (ev) {
                   var ev = ev || window.event;
                   This.fnMove(ev);
               };
               
               //鼠标松开事件初始化
               document.onmouseup = function () {
                   This.fnUp();
               };
               return false;
           };
      
       };
      
       //鼠标按下操作
       Drag.prototype.fnDown = function (ev) {
           this.disX = ev.clientX - this.obj.offsetLeft;
           this.disY = ev.clientY - this.obj.offsetTop;
       };
      
       //鼠标移动操作
       Drag.prototype.fnMove = function (ev) {
           this.obj.style.left = ev.clientX - this.disX + 'px';
           this.obj.style.top = ev.clientY - this.disY + 'px';
       };
      
       //鼠标松开操作
       Drag.prototype.fnUp = function () {
           document.onmousemove = null;
           document.onmouseup = null;
       };
      
  1. 子类继承父类

     function ChildDrag(id) {   //子类
         Drag.call(this, id);//继承父类的属性
     }
    
     //继承父类的方法
     extend(ChildDrag.prototype, Drag.prototype);
    
     //子类重写父类的鼠标移动方法
     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构造函数)

JS是没有类的概念的 , 把JS中的构造函数看做的类

要做属性和方法继承的时候,要分开继承

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>无标题文档</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; //因为是从父类引用而来,所以要重新修正指向问题

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对象)

<!DOCTYPE HTML>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>无标题文档</title>
    <script>

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

        var b = cloneObj(a);

        b.name = '小强';

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

        function cloneObj(obj) {

            var F = function () {
            };

            F.prototype = obj;

            return new F();

        }

    </script>
</head>

<body>
</body>
</html>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,621评论 2 17
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 2,017评论 1 10
  • 如果不了解js的继承的写法,可以先去看看我之前写的js的子类继承父类文章http://www.jianshu.co...
    GQ1994阅读 2,354评论 0 3
  • 面向对象 类,原型,实例三者打交道 类里面存放的都是私有属性和方法 原型prototype上存的都是公有的属性和方...
    Dream_丹丹阅读 299评论 0 0
  • @转自GitHub 介绍js的基本数据类型。Undefined、Null、Boolean、Number、Strin...
    YT_Zou阅读 1,084评论 0 0