继承大致分为两类:
——基于构造器工作模式
——基于对象模式
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 //方便子对象访问父对象的属性
}
提示:只继承父对象的原型属性,对于自身属性不继承(即this值中的属性)
4、原型属性拷贝法——基于构造器模式(拷贝属性模式,使用原型模式)
function extend2(Child,Parent){
var c = Child.prototype
var p = Parent.prototype
for(var i in p){
c[i] = p[i]
}
c.uber = p
}
5、全属性拷贝法(浅拷贝)——基于对象模式
function extendCopy(Parent){
var c = {}
for(var i in Parent){
c[i] = Parent[i]
}
c.uber = Parent
return c
}
提示:不能作用于原型属性——属于拷贝模式
6、深拷贝法(同上,在遇到对象类型时重复调用上述函数)
function deepCopy(Parent){
var c = c || {};
for(var i in Parent){
if(typeof p[i] === "object"){
c[i] = (p[i].constructor === Array)? [ ] : {}
deepCopy(p[i])
}else{
c[i] = p[i]
}
}
return c
}
提示:所有对象都是值传递
7、原型继承法——基于对象工作模式(使用原型链)
function object( o ){
function F(){}
F.prototype = o
return new F()
}
提示:直接在对象之间构建继承关系
8、扩展与增强模式——基于对象工作模式(使用原型链模式属性拷贝模式)
function objectPlus(oParent,oChild){
var n
function F(){}
F.prototype = 0Parent
n=new F()
for(var i in oParent){
n[i] = oParent[i]
}
return n
}
提示:一次性完成对象的继承与扩展
9、多重继承——基于对象工作模式(属性拷贝)
function multi(){
var n = {}, stuff
for(var j =0;j<arguments.length;j++){
stuff [ j ] = arguments [ j ]
for(var i in stuff ){
n[ i ] = stuff [ i ]
}
}
return n
}
提示:会按照父对象的出现顺序依次对它们执行属性拷贝
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)
}
代码出自《JavaScript面向对象编程》