实现继承大致可分为两类
1.基于构造器工作模式
2.基于对象工作模式
----------------------
A 是否使用原型
B 是否执行属性拷贝
C 两者都有(原型属性拷贝)
1.原型链法 Children。prototype = new Parent()
所属模式 1、A
1 function Shape() {
2 this.name="Shape";
3 this.toString = function() {
4 return this.name;
5 };
6 }
7 function TwoDShape() {
8 this.name = '2D shape';
9 }
10 function Triangle(side, height) {
11 this.name = 'Triangle';
12 this.side = side;
13 this.height = height;
14 this.getArea = function() {
15 return this.side *this.height /2;
16 };
17 }
18 //用构造器Shape()(通过new操作符)另建了一个新的对象,然后用它覆盖TwoDShape构造器的prototype属性。Triangle也一样。
19 TwoDShape.prototype = new Shape ();
20 Triangle.prototype =new TwoDShape ();
21 //对对象prototype属性进行完全替换时,可能会对对象的constructor属性产生一定副作用。因此,对对象constructor属性进行重置是个很好的习惯
22 TwoDShape.prototype.constructor = TwoDShape;
23 Triangle.prototype.constructor = Triangle;
24
25 var my = new Triangle(5,10);
26 my.getArea(); //25
27 my.toString //'Triangle'
2.仅从原型继承法 Child.prototype = Parent.prototype;
所属模式 1 B
1 function Shape() {
2 Shape.prototype.name = 'shape';
3 Shape.prototype.toString = function() {
4 return this.name;
5 }
6 }
7 function TwoDShape () {}
8 TwoDShape.prototype =Shape.prototype;
9 TwoDShape.prototype.constructor = TwoDShape;//必须在扩展之前完成继承
10 TwoDShape.prototype.name = '2D shape';
11 function Triangle(side, height) {
12 this.side = side;
13 this.height =height
14 }
15 Triangle.prototype = TwoDShape.prototype;
16 Triangle.prototype.constructor = Triangle;
17 Triangle.prototype.name = 'Triangle';
18 Triangle.prototype.getArea = function (argument) {
19 return this.side * this.height /2;
20 }
21 var my = new Triangle(5,10);
22 my.getArea();//25
23 my.toString(); //'Triangle'
24 //缺点 子对象 的修改会影响 父对象
25 var s = new Shape();
26 s.name; //'Triangle'
3.临时构造器 new F()
所属模式 1 C
不同于第一种方式,她只会继承于parent的原型属性
1 function extend (Child, Parent){
2 var F = function (){};
3 F.prototype = Parent.prototype;
4 Child.prototype = new F();
5 Child.prototype.constructor = Child;
6 Child.uber = Parent.prototype; // 通过uber可以访问父对象
7 }
4.原型属性拷贝法
所属模式 1 C
1 function extend2 (Child,Parent) {
2 var p = Parent.prototype;
3 var c = Child.prototype;
4 for( var i in p ){
5 c[i] = p [i]
6 }
7 c.uber = p;
8 }
上面4中都是基于构造器的工作模式,下面几种是基于对象的工作模式
5.全属性拷贝法(浅属性拷贝法)
所属模式 2 B
1 function extendCopy(p){
2 var c = {};
3 for (var i in p){
4 c[i] = p[i];
5 }
6 c.uber = p;
7 return c;
8 }
6.深拷贝法
所属模式 2 B
1 function deepCopy(p,c) { 2 c = c || {}; 3 for(var i in p){ 4 if(p.hasOwnProperty(i)){ 5 if (typeof p[i] ==='object'){ 6 c[i] = Array.isArray(p[i] ? [] : ?); 7 deepCopy[p[i],c[i]] 8 }else{ 9 c[i] = p[i] 10 } 11 } 12 } 13 return c; 14 }
7.原型继承法
所属模式 2 A
1 function object(o) {
2 function F() {}
3 F.prototype = o;
4 return new F()
5 }
8.扩展与增强模式
所属模式 2 C 方式 5 7 的混合
1 function objectPlus(o,stuff){ //对象o用来继承 对象stuff用于拷贝方法与属性
2 var n ;
3 function F() {}
4 F.prototype = o;
5 n.uber =o;
6 for (var i in stuff) {
7 n[i] = stuff[i];
8 }
9 return n;
10 }
9.多重继承法
所属模式 2 B
按照父对象出现的顺序依次对他们执行属性全拷贝
1 function multi() {
2 var n = {},stuff,j = 0,len=arguments.length;
3 for(j= 0; j< len; j++) {
4 stuff = arguments[j];
5 for(var i in stuff){
6 n[i] = stuff[i];
7 }
8 }
9 return n ;
10 }
10.寄生继承法
所属模式 2 A
1 function parasite(victim) { //父对象victim
2 var that = object(victim);
3 that.more = 1;
4 return that;
5 }
6 //例子
7 var Parent = {
8 name :'parent',
9 num:10
10 }
11 function Son(m){
12 var that = new Object(Parent);
13 that.name='son';
14 that.getRun = function () {
15 return that.name + 'runs' + this.m +'m' ;
16 }
17 }
18 var t = Son(200);
19 t.getRun() //son runs 200m
20 t.num //10
11.构造器借用法
所属模式 基于构造器
1 function Parent(id) {
2 this.id = id;
3 }
4 function Son(){
5 Parent.apply(this,arguments);
6 }
7 var t = new Son(100);
8 t.id //100
12.构造器借用与属性拷贝法
所属模式 基于构造器 原型链 属性拷贝
1 function Child() {
2 Parent.appply(this,arguments);
3 }
4 extend2(Child, Parent);