原型继承的几种方式

1. 原型链法(仿传统)

代码示例

1
Child.prototype = new Parent()

所属模式

基于构造器工作的模式
使用原型链模式

技术注解

默认继承机制
提示:我们可以将方法与属性集中可重用的部分迁移到原型链中,而将不可重用的那部分设置为对象的自身属性

2.仅从原型继承法

代码示例

1
Child.prototype = Parent.prototype

所属模式

基于构造器工作的模式
原型拷贝模式(不存在原型链,所有的对象共享一个原型对象)

技术注解

由于该模式在构建继承关系时不需要新建对象实例,效率上会有较好的表现
原型链上的查询也会比较快,因为这里根本不存在链
缺点在于,对子对象的修改会影响其父对象

3.临时构造器法

代码示例

1
2
3
4
5
6
7
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值中的属性)则不予继承
另外,该模式还为我们访问父对象体提供了便利的方式(即通过uber属性)

4.原型属性拷贝法

代码示例

1
2
3
4
5
6
7
8
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.全属性拷贝法(即浅拷贝法)

代码示例

1
2
3
4
5
6
7
8
function extendCopy(p){
var c = {}
for(var i in p){
c[i] = p[i]
}
c.uber = p
return c
}

所属模式

基于对象工作模式
属性拷贝模式

技术注解

非常简单
没有使用原型属性

6.深拷贝法

代码示例

1
5,只需在遇到对象类型时重复调用上述函数即可

所属模式

基于对象工作模式
属性拷贝模式

技术注解

与方法5基本相同,但所有对象执行的都是值传递

7.原型继承法

代码示例

1
2
3
4
5
function object(o){
function F(){}
F.prototype = o
return new F()
}

所属模式

基于对象工作模式
使用原型链模式

技术注解

丢开仿类机制,直接在对象之间构建继承关系
发挥原型固有优势

8. 扩展与增强模式

代码示例

1
2
3
4
5
6
7
8
9
10
11
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.多重继承法

代码示例

1
2
3
4
5
6
7
8
9
10
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
}

所属模式

基于对象工作模式
属性拷贝模式

技术注解

一种混合插入式(mixin-style)继承实现
它会按照父对象的出现顺序依次对它们执行属性全拷贝

10.寄生继承法

代码示例

1
2
3
4
5
function parasite(victim){
var that = object(victim)
that.more = 1
return that
}

所属模式

基于对象工作模式
使用原型链模式

技术注解

该方法通过一个类似构造器的函数来创建对象
该方法会执行相应的对象拷贝,并对其进行扩展,然后返回该拷贝

11.构造器借用法

代码示例

1
2
3
function Child(){
Parent.apply(this,arguments)
}

所属模式

基于构造器工作模式

技术注解

该方法可以只继承父对象的自身属性
可以与方法1结合使用,以便从原型中继承相关内容
它便于我们的子对象继承某个对象的具体属性(并且还有可能是引用类属性)时,选择最简单的处理方式

12.构造器借用与属性拷贝法

代码示例

1
2
3
4
function Child(){
Parent.apply(this, arguments)
}
extend2(Child, Parent)

所属模式

使用构造器工作模式
使用原型链模式
属性拷贝模式

技术注解

该方法是方法11与方法4的结合体
它允许我们在不重复调用父对象构造器的情况下同时继承其自身属性和原型属性