• 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

     

  • 相关阅读:
    一次失败的架构评审会议
    在搜索引擎面前经验是如此苍白
    中层难当
    js调试的小工具
    用js小类库获取浏览器的高度和宽度信息
    js过滤HTML标签以及 
    语句
    .NET中回调事件的简单分析
    javascript中类的定义及其方式(《javascript高级程序设计》学习笔记)
    JavaScript中的16进制字符(改进)
  • 原文地址:https://www.cnblogs.com/fmyao/p/12559896.html
Copyright © 2020-2023  润新知