1,原型链法(仿传统)
Child.prototype = new Parent();
- 基于构造器的工作模式;
- 使用原型链模式;
注解:
- 默认继承机制。
- 我们可以将方法与苏醒几种可重用的部分迁移到原型链中,而将不可重用的那部分设置为对象的自身属性。
2,仅从原型继承法
Child.prototype = Parent.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值中的属性)则不予继承。
- 另外,该模式还为我们访问父对象提供了便利的方式(即通过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;
}
- 基于对象工作模式;
- 属性拷贝模式。
注解:
- 非常简单;
- 没有使用原型属性。
6,深拷贝法
代码同上,只需要在遇到对象类型时重复调用上述函数即可。
- 基于对象工作模式;
- 属性拷贝模式。
注解:
- 与方法5基本相同,但所有对象执行的都是值传递。
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;
}
- 基于对象工作模式;
- 属性拷贝模式。
注解:
- 一种混合插入式(mixin-style)继承实现。
- 它会按照父对象的出现顺序依次对它们执行属性全宝贝。
10,寄生继承法
function parasite(victim){
var that = object(victim);
that.more = 1;
return that;
}
- 基于对象工作模式;
- 使用原型链模式;
注解:
- 该方法通过一个类似构造器的函数来创建对象;
- 该函数会执行相应的对象拷贝,并对起进行扩展,然后返回该拷贝。
11,构造器借用法
function Child() {
Parent.apply(this, arguments);
}
- 基于构造器工作的模式;
注解:
- 该方法可以只继承父对象的自身属性。
- 可以与方法1结合使用,以便从原型中继承相关内容。
- 它便于我们的子对象继承某个对象的具体属性(并且还有可能是引用类型属性)时,选择最简单的处理方式。
12,构造器借用与属性拷贝法
function Child(){
Parent.apply(this, arguments);
}
extend2(Child, Parent);
- 使用构造器工作模式;
- 使用原型链模式;
- 属性拷贝模式。
注解:
- 该方法是方法11与方法4的结合体。
- 它允许我们在不重复调用父对象构造器的情况下同时继承其自身属性和原型属性。
面对这么多方法,我们应该如何做出正确的选择?事实身上这取决于我们的设计风格、性能需求、具体项目任务及团队。
转载请注明带链来源:春语精椿