javascript 继承2 总结

来源:互联网 发布:spark编程指南 pdf 编辑:程序博客网 时间:2024/06/10 18:01

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

0 0