#22004/6/4 9:06:53
类继承:方法继承和属性继承 方法继承是将父类的能力传递给子类,属性继承传递的则是参数(属性值)。
在AC中,类方法连接到原型属性上,因此方法也是通过原型继承的。另一方面,类的属性通常属于实例对象本身,而不属于原型。这被称为实例属性,它们是在构造函数中创建的。(注:这个一般规则也存大例外情况,你可以将方法放在父类的原型中,属性也可以这样做,从而使子类在原型链中继承这些属性,它们被称为“类属性”而不是“实例属性”。
通过super()属性继承
例:先看一个简单的Parent类
Parent = function (a,b) {
this.sum = a+b;
};
假设我们希望定义一个Child对名象,它知道Parent所知道的所有事情,还要再加上额外的一些事情。
Child function = (a,b) {
this.pro = a*b;
}
通过下面程序实现继承:
Child = fucntion () {
super (a,b);
this.pro = a*b;
}
属性继承过程是每个实例逐个进行的。而方法继承则是每个类只进行一次的。
方法继承,同样可以通super ()实现!
Parent.prototype.printSum = function () {
trace(this.sum);
}
Child.prototype.printSum = function () {
super.printSum();
trace("child printSum()");
通过new方法继承
Chile.prototype = new Parent();
不过用new方法继承会导致一些不良后果:
1、构造函数代码的执行会浪费更多的CPU时间
2、实列属性会被错误的创建在原型中。这些是没有意义的属性,它们没有用处确浪费了内存。
3、如果构造函数创建了新的影片段,则在使用new语法建立原型链时会出现多余的影片片段;
4、现有的类原型会被新的对象代替。结果是原型中的所有方法都被清除。
5、子类原型的constructor属性会被错误的设置为父类。而实际上他应该被设置为子类。
6、考虑OOP的方法,不应该为了建立方法继承而必须运行你类的构造函数。
建立方法继承的更直接和更有效的方法是使用_proto_属性。
Child.prototype._proto_ = Parent.prototype;
不过不幸的是,由于FLASH MX插放器中的一个错误,当使用_proto_语法来实现继承时,super()函数就不能正常工作
不过有两个方案可以解决!
_constructor_ 方案
supCon() 方案
例: _constructor_ 方案
Function.prototype.extend = function (superclass) {
this.prototype._proto_ = superclass.prototype;
this.prototype._constructor_ = superclass;
};
例:supCon() 方案
child.prototype.superCon = function () {
arguments.caller.prototype._proto_.constructor.apply(this,arguments);
}
然后就可以用该方法代替super()
Child = function (a,b) {
this.superCon(a,b);
}
更具冒险精神的程序员可能会考虑将之添加到Object.prototype中使所有对象都继承该方法:
Object.prototype.superCon = function () {
arguments.caller.prototype._proto_.constructor.apply(this,arguments);
}
ASSetPropFlage (Object.prototype, "superCon", 1);
为了避免过多的for···in 循环,使用ASSetPropFlage()是必需的!不过该代码是末公开的!!不过已经有很多人在用!
(注:以上所有全摘自robert penner《MX编程与创意实现》一书,我少有改动)