Javascript面向对象编程(三):非构造函数的继承

什么是"非构造函数"的继承?

e.g

  var Chinese={

    nation:'中国'

  };

  var Doctor={

    career:'医生'

  };

那么,如何生成一个"中国医生"的对象?

该两个对象都是普通对象,不是构造函数,所有是不可以用构造函数方法实现"继承"的。

一、 object()方法

json格式的发明人Douglas Crockford提出object()函数,可以做到这一点:

  function object(o){

    function F(){}

    F.prototype=0;

    return new F();

  }

其实就是把子对象的prorotype属性,指向父对象,从而使得子对象和父对象连在一起。

使用时:

  var Doctor=new object(Chinese);

  Doctor.career='医生';

  alert(Doctor.nation);  //中国

二、 浅拷贝:把父对象的属性,全部拷贝给子对象来实现继承。

  function extendCopy(p){

    var x={};

    for(var i in p){

      x[i]=p[i];

    }

    x.uber=p;

    return x;

  }

使用时:

  var Doctor=extendCopy(Chinese);

  Doctor.career='医生';

  alert(Doctor.nation);  //中国

Q:为什么叫做浅拷贝?

A:如果父对象的属性是数组或者另一个对象(类似于C#里面引用类型的概念),那么实际上,子对象获得的只是一个内存地址,该地址指向另一个真实的值。

下面举一个例子,就类似于C#里面的引用类型在其他地方被篡改的形式(思想上雷同):

  Chinese.cities=["北京","上海","广州","深圳"];

  var Doctor=extendCopy(Chinese);

  Doctor.cities.push("南京");

由于Chinese的cities是数组(相当于C#中来说,就是引用类型的变量),在子对象中被新增了一个"南京"之后,其实Chinese父对象也会发生改变:

  alert(Doctor.cities);  // 北京,上海,广州,深圳,南京

  alert(Chinese.cities);  // 北京,上海,广州,深圳,南京

三、 深拷贝

深拷贝,其实就是递归浅拷贝。(不知道递归的同学去翻书and面壁)

  function deepCopy(p,c){

    var c=c||{};

    for(var i in p){

      if(typeof p[i]==='object'){

        c[i]=(p[i].constructor===Array)?[]:{};

        deepCopy(p[i],c[i]);

      }else{

        c[i]=p[i];

      }

    }

    return c;

  }

使用时:

  var Doctor=deepCopy(Chinese);

  Chinese.cities=["北京","上海","广州","深圳"];

  Doctor.cities.push("南京");

 

  alert(Doctor.cities);  //北京、上海、广州、深圳、南京

  alert(Chinese.cities);  //北京、上海、广州、深圳

目前的jQuery库使用的就是这种继承方法。

posted @ 2015-12-14 15:42  我喂自己袋盐_1989  阅读(195)  评论(0)    收藏  举报