继续上一篇的话题继承,这里主要讲下实际开发的运用。
冒充方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| function ClassA(sColor) { this.color = sColor; this.sayColor = function () { alert(this.color); }; } function ClassB(sColor) { } function ClassB(sColor) { this.newMethod = ClassA; this.newMethod(sColor); delete this.newMethod; } function ClassB(sColor, sName) { this.newMethod = ClassA; this.newMethod(sColor); delete this.newMethod; this.name = sName; this.sayName = function () { alert(this.name); }; } var objA = new ClassA("blue"); var objB = new ClassB("red", "John"); objA.sayColor(); objB.sayColor(); objB.sayName();
|
这种方式同样也可以多重继承,尽管不推崇,但是有一点可以看出这个继承的灵活性
1 2 3 4 5 6 7 8 9
| function ClassZ() { this.newMethod = ClassX; this.newMethod(); delete this.newMethod; this.newMethod = ClassY; this.newMethod(); delete this.newMethod; }
|
call
和 apply
方式
这种方式是利用了this
这个关键字,实现的函数成员的复制,同时call和apply也可以利用这个原理实现继承
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| function ClassB(sColor, sName) { ClassA.call(this, sColor); this.name = sName; this.sayName = function () { alert(this.name); }; } function ClassB(sColor, sName) { ClassA.apply(this, new Array(sColor)); this.name = sName; this.sayName = function () { alert(this.name); }; }
|
prototype方式
1 2 3 4 5 6 7 8 9
| function ClassB() { } ClassB.prototype = new ClassA(); ClassB.prototype.name = ""; ClassB.prototype.sayName = function () { alert(this.name); };
|
原型链是不支持多重继承。记住,原型链会用另一类型的对象重写类的 prototype 属性。
混合方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| function ClassA(sColor) { this.color = sColor; } ClassA.prototype.sayColor = function () { alert(this.color); }; function ClassB(sColor, sName) { ClassA.call(this, sColor); this.name = sName; } ClassB.prototype = new ClassA(); ClassB.prototype.sayName = function () { alert(this.name); };
|
继承机制由ClassA.call(this, sColor);
和
ClassB.prototype = new ClassA();
共同作用。
ClassA.call(this, sColor);
在 ClassB 构造函数中,用对象冒充继承 ClassA 类的 sColor 属性。
ClassB.prototype = new ClassA();
用原型链继承 ClassA 类的方法。由于这种混合方式使用了原型链,所以 instanceof 运算符仍能正确运行。
拷贝方式
1 2 3 4 5 6 7 8
| function extend2(Child, Parent) { var p = Parent.prototype; var c = Child.prototype; for (var i in p) { c[i] = p[i]; } c.uber = p; }
|
深拷贝(递归拷贝)
1 2 3 4 5 6 7 8 9 10 11 12
| function deepCopy(p, c) { var c = c || {}; for (var i in p) { if (typeof p[i] === 'object') { c[i] = (p[i].constructor === Array) ? [] : {}; deepCopy(p[i], c[i]); } else { c[i] = p[i]; } } return c; }
|
jquery就是采用了拷贝的方式。