主题:  继承的问题

阿文2

职务:普通成员
等级:1
金币:0.0
发贴:40
注册:2002/1/7 15:07:15
#12004/6/3 20:33:07
小弟想请教个继承的问题,请看以下两段代码:
function ParentClass(){
var privateData=1;
this.publicData=2;
}
function ChildClass(){
this.prototype=new ParentClass();
}
childObject=new ChildClass();
trace(childObject.privateData);
trace(childObject.publicData);


function ParentClass(){
var privateData=1;
this.publicData=2;
}
function ChildClass(){}
ChildClass.prototype=new ParentClass();
childObject=new ChildClass();
trace(childObject.privateData);
trace(childObject.publicData);

小弟觉得这两段代码是等价的,但为何第一段代码flash mx返回两个undefine,而第二段代码却返回undefine和2;小弟不懂,望各位高手指教。谢谢



UndeadCraft

职务:版主
等级:4
金币:10.0
发贴:1993
注册:2001/5/28 17:37:43
#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编程与创意实现》一书,我少有改动)