美文网首页JavaScript设计模式
学习JavaScript设计模式——面向对象(四)

学习JavaScript设计模式——面向对象(四)

作者: 小霸王的铲屎官 | 来源:发表于2019-03-04 17:53 被阅读0次

    面向对象(四)

    继承

    4. 多继承——老师不止一位

    • 首先,JavaScript实现多继承是有一些局限性的,因为JavaScript中继承时依赖于prototype链实现的,只有一条原型链,所以理论上不能继承多个父类的
    • 通过一些技巧和方法可以继承多个对象的属性来实现类似的多继承
      // 继承单对象属性的方法extend方法
      
      // 单继承属性复制
      let extend = (target, source)=> {
        // 遍历元对象中的属性
        for(let property in target) {
          // 将源对象中的属性复制到目标对象中
          target[property] = source[property]
        }
        // 返回目标对象
        return target
      }
    

    测试代码

     let book = {
        name: 'JavaScript 设计模式',
        alike: ['css', 'html', 'JavaScript']
     }
     
     let anotherBook = {
       color: 'blue'
     }
     
     extend(anotherBook, book)
     
     console.log(anotherBook.name)  // 'JavaScript 设计模式'
     console.log(anotherBook.alike) // ['css', 'html', 'JavaScript']
     
     anotherBook.alike.push('ajax')
     anotherBook.name = '设计模式'
     
     console.log(anotherBook.name)  // 设计模式
     console.log(anotherBook.alike) // ['css', 'html', 'JavaScript', 'ajax']
     
     console.log(book.name)         // JavaScript 设计模式
     console.log(book.alike)        // ['css', 'html', 'JavaScript', 'ajax']
     
    

    传递多对象进行继承

     // 多继承 属性复制
     const mix= () =>{
        let i = 1;                    // 从第二个参数起为被继承的对象
        let len = arguments.length    // 获取参数的长度
        let target = arguments[0]     // 第一个参数为目标对象
        let arg                       // 缓存参数对象
        
        // 遍历被继承的对象
        for(;i<len;i++){
          // 缓存当前对象
          arg = arguments[i]
          // 遍历被继承对象中的属性
          for(let property in arg){
             // 将被继承的对象的属性复制到目标对象中
             target['property'] = arg['property']
          }
        }
        // 返回目标对象
        return target
     }
    
    
    • 这个函数有个缺点,需要传入目标对象(第一个参数)
    • 如果将它绑定到原生对象Object上的话,所有对象都可以拥有这个方法 如下
      Object.prototype.mix =()=> {
         let i = 0                    // 从第一个参数起为被继承的对象
         let len = arguments.length   // 获取参数的长度
         let arg                      // 缓存参数对象
         for(; i<len; i++) {
            // 缓存当前对象
            arg = arguments[i]
            // 遍历被继承对象的属性
            for(let property in arg) {
              // 将被继承对象中的属性复制到目标对象中
              this[property] = arg[property]
            }
         }
      }
    
    

    测试代码

      let book1 = {
        name: 'JavaScript 设计模式',
        alike: ['css', 'html', 'js']
      }
      
      let book2 = {
        color: 'blue'
      }
      
      let otherBook = {}
      
      otherBook.mix(book1, book2)
      console.log(otherBook)        // Object { name:'JavaScript 设计模式', alike: Array(3), color: 'blue', mix: function }
      
    
    

    明天继续多态,还可能总结得到一设计模式了

    相关文章

      网友评论

        本文标题:学习JavaScript设计模式——面向对象(四)

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