天天看点

JS原型继承与原型链(三)

非构造函数的继承

  var Chinese = {
    nation:'中国'
  };      
  var Doctor ={
    career:'医生'
  }      

一、object()方法

  function object(o) {

    function F() {}

    F.prototype = o;

    return new F();

  }

    //使用时第一步先在父对象的基础上,生成子对象
    var Doctor = object(Chinese);
    //再加上子对象本身的属性
    Doctor.career = '医生';      

二、浅拷贝

  function extendCopy(p) {

    var c = {};

    for (var i in p) {
      c[i] = p[i];
    }

    c.uber = p;

    return c;
  }

     //使用时
      var Doctor = extendCopy(Chinese);

  Doctor.career = '医生';

  alert(Doctor.nation); // 中国      

但是,这样的拷贝有一个问题。那就是,如果父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,而不是真正拷贝,因此存在父对象被篡改的可能。

三、深拷贝

  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;
  }      

它的实现并不难,只要递归调用"浅拷贝"就行了。目前,jQuery库使用的就是这种继承方法。

参考资料:

http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance_continued.html