prototype 用法?--转自wiyiflash

      闪客资源 2004-8-21 16:55
www.wiyiflash.com/bbs/showthread.asp?threadid=128
Re:prototype 用法?

这个得从类说起了.对同一个类的不同实例而言,它们的属性可能各不相同,但它们具有的功能或行为(或称方法)却是相似的.拿人来说,每个人的相貌各不相同,但生活学习等等的能力却是相似.为了提高程序运行的效率,一般并不将功能性的模块(方法)复制给生成的每个实例,而是将它们写在类的prototype对象上,然后在生成的实例中定义一个__proto__属性,令它指向类的原型prototype对象.as1.0示例如下:
var Dog=function(type,name,age){
//这里定义属性
this.type=type;
this.name=name;
this.age=age;
}
//将方法定义到Dog的prototype对象上
Dog.prototype.sound=function(){
trace("woof woof");
}
var 小黑=new Dog("德国黑贝","小黑",2);
//这时"小黑"也具备了一个属性__proto__,它指向Dog.prototype
小黑.sound();
//因为小黑自身并无sound()方法,所以播放器会搜索小黑的__proto__对象有无该方法,如果有则执行

其实,在as1.0中的继承也是基于这个机制,如果希望Dog可以使用MoveiClip的方法:
Dog.prototype.__proto__=MovieClip.prototype;

话说回来,现在推荐的是使用as2.0的语法,上面的例子可以写成:
//在Dog.as文件里写:
class Dog{
public var type:String;
public var name:String;
public var age:Number;
function Dog(type:String,name:String,age:String){
this.type=type;
this.name=name;
this.age=age;
}
public function sound(){
trace("woof woof");
}
}

其实它的内部机制还是和as1.0一脉相承的,也就是说,Dog还是有一个prototype原型对象, sound()方法还是写在prototype对象上, 而实例还是通过__proto__属性来指向prototype.这样测试:
//在dog.fla文件中写
var 小黑=new Dog("德国黑贝","小黑",2);
trace(小黑.__proto__==Dog.prototype);
//测试结果为:true

总之,一般情况下你不需要了解这些内部的实现机制,但如果你要开发自己的类的话,还是有必要了解的.




标签集:TAGS:
回复Comments() 点击Count()

回复Comments

{commentauthor}
{commentauthor}
{commenttime}
{commentnum}
{commentcontent}
作者:
{commentrecontent}