内容出自(javascript面向对象编程指南) 译者 凌杰 作者 Stoyan Stefanvo(加)
分类
1.基于模式
基于构造器工作模式
基于对象工作工作的模式
2.基于条件进行模式分类
是否使用原型
是否执行属性
两者都有(即执行原型属性拷贝)
方法编号 | 方法名称 | 代码示例 | 所属模式 | 技术注解 |
1 | 原型链法(仿传统) | Child.prototype = new Parent(); | 基于构造器工作模式 使用原型链模式 | ECMA标准中的默认继承机制。 提示:我们可以将方法和属性 集中可重用的部分迁移到原型链 中,而将不可重用的那部分设置 为该对象的自身属性 |
2 | 仅从原型继承法 | Triangle.prototype = TwoDShape.prototype; | 基于构造器工作模式 原型拷贝模式(不存在原型,所有的对象共享一个原型对象) | 由于该模式在构建继承关系时 不需要新建对象实例,效率上 会有较好的表现。 原型链上的查询也会比较快, 因为这里根本不存在链,而缺点 在于,对子对象的修改会影响到 父对象 |
3 | 临时构造法 | function extend(Child,Parent){ var F = function(){}; F.prototype = Parent.prototype; Child.prototype = new F(); Child.prototype.constructor = Child; Child.uber = Parent.prototype; } | 基于构造器工作模式 使用原型链模式 | 此模式不同于1号方法,它只 继承父对象的原型属性,而对 于其自身属性(也就是被构造 器添加到this值中的属性)则 不予继承。该模式在YUI和 Extjs等程序库中均有应用。另外 ,该模式还为我们访问父对象 提供了便利的方法(即通过uber 属性) |
4 | 原型属性拷贝法 | function extend2(Child,Parent){ var p = Parent.prototype; var c = Child.prototype; for(var i in p){ c[i] = p[i]; } c.uber = p; } | 基于构造器工作模式 拷贝属性模式 使用原型模式 | 将父对象原型中的内容全部 转成子对象原型属性。 无需为继承单独创建对象实例。 原型链本身也更短 |
5 | 全属性拷贝法(即浅拷贝法) | function extendCopy(p){ var c = {}; for(var i in p){ c[i] = p[i]; } c.uber = p; return c; } | 基于对象工作模式 属性拷贝模式 | 非常简单化。 在Firebug、jQuery以及Prototype.js 的早期版本中都有应用。 引入了浅概念。 不能作用于原型属性 |
6 | 深拷贝法 | function deepCopy(p,c){ var c = c || {}; for(var i in p){ if(typeof p[i] === 'object'){ c[i] = (p[i].constructor === Array) ? []:{}; }else{ c[i] = p[i]; } } } | 基于对象工作模式 属性拷贝模式 | 与方法5基本相同,但所有对象执行的都是值传递。在jQuery近期版本中广泛应用 |
7 | 原型继承法 | function object(o){ function F(){}; F.prototype = o; return new F(); } | 基于对象工作模式 使用原型链模式 | 丢开仿类机制,直接在对象之 间构建继承关系。发挥原型固 有优势 |
8 | 扩展与增强模式 | function objectPlus(o,stuff){ var n; function F(){} F.prototype = o; n = new F(); n.uber = o; for(var i in stuff){ n[i] = stuff[i]; } return n; } | 基于对象工作模式 使用原型链模式 属性拷贝模式 | 该方法实际上是原型继承法(方 法7)和属性拷贝法(方法5) 的混合应用。它通过一个函数一次性 完成对象的继承和扩展。 |
9 | 多重继承 | function multi(){ var n = {},stuff,j= 0,len = arguments.length; for(j = 0; j <len; j++){ stuff = arguments[j]; for(var i in stuff){ n[i] = stuff[i]; } } return n; } | 基于对象工作模式 属性拷贝模式 | 一种混合插入式继承实现。 它会按照父对象的出现顺序依次对它们执行属性全拷贝。 |
10 | 寄生继承法 | function triangle(o){ var that = object(o); that.name = 'Triangle'; return that; } | 基于对象工作模式 使用原型链模式 | 该方法通过一个类似构造器的函数来创建对象。 该函数会执行相应的对象拷贝,并对其进行扩展,然后返回该拷贝 |
11 | 构造器借用法 | function Triangle(){ Shape.apply(this,arguments); } | 基于构造器工作模式 | 该方法可以只继承父对象的自身属性,也可以与方法1结合使用,以便从原型中继承相关内容。它便于我们的子对象继承某个对象的具体属性(并且还可能是引用类属性)时,选择最简单的处理方式 |
12 | 构造器借用与属性拷贝法 | function Triangle(){ Shape.apply(this,arguments); } extend2(Triangle,Shape); | 基于对象工作模式 使用原型链模式 属性拷贝模式 | 该方法是方法11与方法4的结合体,它允许我们在不重复调用父对象构造器的情况下同时继承其自身属性和原型属性。 |