《JavaScript设计模式》——2.4 老师不止一位——多继承

2.4 老师不止一位——多继承

“是这样呀,对了,我记得有一些面向对象语言中支持多继承,在JavaScript中能实现么?”

“嗯,不过是有一些局限性的。你知道,在JavaScript中继承是依赖于原型prototype链实现的,只有一条原型链,所以理论上是不能继承多个父类的。然而JavaScript是灵活的,通过一些技巧方法你却可以继承多个对象的属性来实现类似的多继承。”小铭接着说,“讲解多继承之前先跟你说一下当前很流行的一个用来继承单对象属性的extend方法。”

// 单继承 属性复制  
var extend = function(target, source) { 
  // 遍历源对象中的属性
  for (var property in source) {
    // 将源对象中的属性复制到目标对象中
    target[property] = source[property]; 
  }
  // 返回目标对象
  return target; 
};

“原来extend方法的实现就是对对象中的属性的一个复制过程呀。”小白惊讶地说。

“嗯,是这样,我们的这个extend方法是一个浅复制过程,他只能复制值类型的属性,对于引用类型的属性它无能为力。而在jquery等一些框架中实现了深复制,就是将源对象中的引用类型的属性再执行一遍extend方法而实现的。我们这里实现得比较简单,所以你测试也比较容易。”

于是小白写下如下测试代码。

var book = {
  name : 'JavaScript设计模式',
  alike : ['css', 'html', 'JavaScript']
}
var 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"]

“真的是这样。但是多继承呢?”

“很容易,既然上面的方法可以实现对一个对象属性的复制继承,那么如果我们传递多个对象呢?”

// 多继承 属性复制  
var mix = function() { 
  var i = 1,           // 从第二个参数起为被继承的对象
    len = arguments.length,   // 获取参数长度
    target = arguments[0],   // 第一个对象为目标对象
    arg;              // 缓存参数对象
  // 遍历被继承的对象
  for(; i < len; i++){
    // 缓存当前对象
    arg = arguments[i];
    // 遍历被继承对象中的属性
    for (var property in arg) {
      // 将被继承对象中的属性复制到目标对象中
      target[property] = arg[property]; 
    }
  }

  // 返回目标对象
  return target; 
};

“mix方法的作用就是将传入的多个对象的属性复制到源对象中,这样即可实现对多个对象的属性的继承。”

“这是实现方式真不错,可是使用的时候需要传入目标对象(第一个参数——需要继承的对象)。”

“当然你也可以将它绑定到原生对象Object上,这样所有的对象就可以拥有这个方法了。”

Object.prototype.mix = function(){
  var i = 0,           // 从第一个参数起为被继承的对象
    len = arguments.length,  // 获取参数长度
    arg;              // 缓存参数对象
  // 遍历被继承的对象
  for(; i < len; i++){
    // 缓存当前对象
    arg = arguments[i];
    // 遍历被继承对象中的属性
    for (var property in arg) {
      // 将被继承对象中的属性复制到目标对象中
      this[property] = arg[property]; 
    }
  }
}

“这样我们就可以在对象上直接调用了。如……”

otherBook.mix(book1, book2);
console.log(otherBook);  // Object {color: "blue", name: "JavaScript设计模式", mix: function, about: "一本JavaScript书"}

“在JavaScript中实现的多继承是如此的美妙。”

时间: 2024-11-02 04:12:22

《JavaScript设计模式》——2.4 老师不止一位——多继承的相关文章

《JavaScript设计模式》——2.2 包装明星——封装

2.2 包装明星--封装 2.2.1 创建一个类 "在JavaScript中创建一个类很容易,首先声明一个函数保存在一个变量里.按编程习惯一般将这个代表类的变量名首字母大写.然后在这个函数(类)的内部通过对this(函数内部自带的一个变量,用于指向当前这个对象)变量添加属性或者方法来实现对类添加属性或者方法,例如:" var Book = function(id, bookname, price){ this.id = id; this.bookname= bookname; this

《JavaScript设计模式》——第1章 灵活的语言——JavaScript 1.1入职第一天

第一篇 面向对象编程 面向对象编程(Object-oriented programming,OOP)是一种程序设计范型.它将对象作为程序的基本单元,将程序和数据封装其中,以提高程序的重用性.灵活性和扩展性. 第1章 灵活的语言--JavaScript JavaScript设计模式 结束了4年的大学学习生活,小白信心满满地来到应聘的M公司.今天是入职的第一天,项目经理分下来一个验证表单功能的任务,内容不多,仅需要验证用户名.邮箱.密码等. 1.1 入职第一天 小白接到需求看了看,感觉很简单,于是便

旅游陷阱调查:“大师”不止一位宣传天花乱坠

旅游陷阱调查 苏州张继书院: "大师"不止一位 宣传天花乱坠 欢迎继续收看经济信息联播.五一就快到了,我们来说说旅游的话题,旅游的时候,人们往往会选择那些有深厚历史人文色彩的景点.唐代诗人张继有一首<枫桥夜泊>,其中的名句"姑苏城外寒山寺,夜半钟声到客船",让苏州的枫桥成了游客必去的景点之一.一些游客也很自然地会升发出怀古的幽情,购买和历史相关联的纪念品也很常见.然而,优美的风光和著名的人文景观背后,却隐藏着一些精心设置的陷阱.来看记者的调查 枫桥风景名

JavaScript设计模式之观察者模式

设计模式(Design Pattern)对于软件开发来说其重要性不言而喻,代码可复用.可维护.可扩展一直都是软件工程中的追求!对于我一个学javascript的人来说,理解设计模式似乎有些困难,对仅切图.做少量交互效果的FE甚至可能不会用到,但是当你开始使用Angular/Backbone等框架的时候,就无法避免设计模式.MVC/MVVM这些东西了(反正我是伤脑筋). 我学设计模式是刚开始接触编程大概三个月的时候,看一本书<大话设计模式>,里面用C#语言来写,我很无语,因为强类型的编程语言对于

JavaScript设计模式系列之原型模式

prototype模式通过实例对象指定需要创建的类型,这与factory method模式有本质不同,factory method模式是通过类的继承定义不同子类来达到创建不同类型对象的目的,属于类模式,prototype模式通过调用组合的对象成员生成不同类型的对象实例,属于对象模式. 由于这个特性,prototype具有以下适用场合: · 需要运行时确定实例化的类时,比如动态装载库时 · 避免创建过多子类时.子类太多永远是不受欢迎的,在factory method中我们也提到通过模板或者参数化来

javascript设计模式:JavaScript设计模式学习一之接口

看完了<JavaScript王者归来>,在图书馆找了<JavaScript设计模式>来看,之前设计模式方面的书看过:<Head First 设计模式>.<设计模式之禅>,GOF的<Design Patterns: Elements of Reusable Object-Oriented Software>看了一部分.记得以前没这些基础的时候,看<JavaScript设计模式>简直是不知道作者在说什么.言归正传:准确的说,JavaScr

javascript设计模式交流(2)

最后是finish函数 在beam的基础上修改一下就可以了 我们可以通过finish检查,来决定求一个可行 解.求所有解.还是对解计数,下面的finish是求出并打印所有解. Code: function finishQueen(){ if(this.depth<this.size)return false; x=this.pos;y=this.depth-1; while(--x>=0&&--y>=0) if(this[y][x]!=0)return false; x=

JavaScript设计模式学习之“类式继承”

 这篇文章主要介绍了JavaScript设计模式学习之"类式继承",本文直接用代码实例讲解类式继承的实现方法,需要的朋友可以参考下     在做一件事情之前,首先要清楚做这件事情的好处有什么,相信不会有哪个人愿意无缘无故的去做事情.一般说来,我们在设计类的时候,实际上就是希望能减少重复性的代码,使用继承可以完美的做到这一点,借助继承机制,你可以在现有类的基础上再次进行设计并且充分利用它们已经具备的各种方法,而对设计的修改也更为轻松.废话不多说了,举例说明: 代码如下: function

Javascript设计模式之观察者模式的多个实现版本实例

 这篇文章主要介绍了Javascript设计模式之观察者模式的多个实现版本实例,本文给出3种实现版本代码,同时给出了Jquery实现版本,需要的朋友可以参考下     介绍 观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己. 使用观察者模式的好处: 1.支持简单的广播通信,自动通知所有已经订阅过的对象. 2.页面载入后目标对象很容易与观