美文网首页
代码复用

代码复用

作者: 李华炎 | 来源:发表于2018-04-11 12:51 被阅读0次

1.原型式继承

  1. 须知:每一个函数都有prototype属性
  2. 对象的构造函数可以从其他对象继承方法,它创建出一个原型对象后,其他所有的新对象都可以基于这个原型对象来构建。
  3. 原型继承的设计适用于单继承。
<script>
   function Person(name) {
       this.name = name;
   }
   Person.prototype.getName = function () {
       return this.name;
   }

   function User(name, password) {
       this.name = name;
       this.password = password;
   }
   User.prototype = new Person('coco');
   User.prototype.getPassword = function () {
       return this.password;
   }

   var u = new User('lili','123456');
   console.log(u.getName()); // 从原型上继承到的方法
   console.log(u.getPassword());
</script>

2.类式继承

  1. 继承自单一函数
  2. 从单一父对象继承所有内容
  3. 从多个父对象继承独立的方法
// 1.一个辅助的函数,将方法绑定到函数的原型上
// 继承自单一函数
Function.prototype.method = function (name, func) {
    this.prototype[name] = func;
    return this;
}

// 2.一个复杂的函数,允许从其他类中继承函数,并且还可以调用父类中的函数。
// 从单一父对象继承所有内容
Function.method('inherits',function (parent) {
    // 记录我们目前所在父层次的级数
    var depth = 0;

    // 继承父对象的方法
    var proto = this.prototype = new parent();

    // 创建一个新的名为uber 的 ‘特权’函数
    // 调用它时会执行所有在继承时被重写的函数
    this.method('uber',function (name) {
        var func; // 要执行的函数
        var ret;    // 函数的返回值
        var v = parent.prototype;   // 父对象的原型
        // 如果我们已经在某个uber函数之内
        if (depth){
            // 上溯必要的depth,以找到原始的prototype
            for (var i = depth; i > 0; i += 1) {
                v = v.constructor.prototype;
            }

            // 从该prototype中获得函数
            func = v[name];

            // 否则这就是 uber 函数的第一次调用
        }else {
            // 从原型获得要执行的函数
            func = proto[name];

            // 如果此函数属于当前的 prototype
            if (func == this[name]){
                // 则改为调用父对象的 prototype
                func = v[name];
            }
        }

        // 记录我们在继承堆栈中所在位置的级数
        depth += 1;

        // 使用除第一个以外所有的 arguments 调用此函数
        // 因为第一个参数是执行的函数名
        ret = func.apply(this,Array.prototype.slice.apply(arguments,[1]));
        // 恢复继承堆栈
        depth -= 1;

        // 返回执行过的函数的返回值
        return ret;
    });
    return this;
});


// 3.只继承父对象特定函数。而非使用 new parent() 继承所有的函数
// 从多个父对象继承独立的方法
Function.method('swiss',function (parent) {
    // 遍历所有要继承的方法
    for (var i = 1; i < arguments.length; i++) {
        // 需要导入的方法名
        var name = arguments[i];

        // 将parent的原型上的name方法赋值给 调用method方法的对象的原型
        this.prototype[name] = parent.prototype[name];
    }
    return this;
});


// 应用案例----------
function Person(name) {                 // 创建一个 Person 构造函数
    this.name = name;
}
Person.method('getName',function () {   // 给Person添加一个新的方法
    return this.name;
});

function User(name, password) {         // 创建一个 User 构造函数
    this.name = name;
    this.password = password;
}

User.inherits(Person);                  // 从 Person对象继承所有方法
User.method('getPassword',function () { // 给 User对象添加一个新方法
   return this.password;
});

// 覆盖继承 Person对象的getName方法,但可以通过uber方法调用原来的getName方法
User.method('getName',function () {
    return 'My name is '+ this.uber('getName');
});

var u = new User('冬瓜',22589);
console.log(u.getName());       // 冬瓜
console.log(u.getPassword());   // 22589

3.Base库

4.Prototype库

相关文章

  • maven module 和 微服务

    代码复用分为:代码模块(module)复用和项目(微服务)复用。 module 划分规范合理,能够使代码复用,是从...

  • 代码复用

    1.原型式继承 须知:每一个函数都有prototype属性对象的构造函数可以从其他对象继承方法,它创建出一个原型对...

  • 代码复用

    地基 仓库 插座

  • 软件工程的永恒主题

    软件工程的永恒主题是“复用”。 复用分为三个层次: 第一层次:代码级复用。 代码级别复用由编程语言提供,例如Jav...

  • xcode 创建可以复用的代码块

    #######摘要: 我们可以常用的代码块创建为模板,方便代码的复用,提高编码效率。Xcode创建可复用的代码块 ...

  • 复用

    从复用角度讲,设计模式是代码级复用、框架是模块级复用、架构是系统级复用、平台是企业应用级复用。

  • Swift Reusable Code Segment

    可复用的swift代码段。为什么用英文做标题?为了突出“复用” 文章的目的:记录经常使用的代码块方便复用更新次数:...

  • trait 代码复用

    trait 是为了减少单继承语言的限制,使开放人员能够自由的在不同层次结构内独立的类中复用method.

  • Flutter -- 代码复用

    继承 (extends) Flutter中的继承是 单继承 构造函数不能继承 子类重写超类的方法,要用 @over...

  • Java编程思想学习笔记(7)

    Java编程思想学习笔记(7) 复用类 复用代码是Java的功能之一。 Java中对代码的复用是围绕着类展开的,可...

网友评论

      本文标题:代码复用

      本文链接:https://www.haomeiwen.com/subject/ktbahftx.html