javascript 继承2 总结

内容出自(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的结合体,它允许我们在不重复调用父对象构造器的情况下同时继承其自身属性和原型属性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaobangsky

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值