prototype
Flash 有一个相当不错的特性,当你调用一个实例的属性或方法时,如果在该实例中没有发现被调用的实例或方法,那么 Flash 会自动查找该实例所属类的一个名为 prototype 的对象,如果在 prototype 对象中找到了该属性或方法就调用它,反之如果没有发现则继续寻找该类的父类的 prototype 对象,以此类推。而且不错的是,这个 prototype 对象会在每个构造函数被创建时候自动生成。而在 ActionScript2.0 中这样的机制依然存在,只是没有显式调用的 prototype。
有了 prototype 我们就可以做很多事情,其中最重要的用途莫过于在一个通用的父类中声明一个属性或者方法让其所有的子类以及实例来继承,而在 ActionScript2.0 中,是不可以随意为一个类添加属性或者方法的(注2)。并且 prototype 好就好在它对于内置类和自定义类同样有效,它是通用的。比如,我们可以像图5-3-4所示建立一个所有数组都可以调用的通用方法:
这里我们声明了一个数组通用的 inverse 方法,利用 prototype 声明后就可以在任何数组实例中像调用内建方法一样的调用它,那么这个例子运行后就会看到该方法作用的结果,得到一个顺序和原来相反的数组。
还有一个问题,既然我们也可以像图5-3-3那样把属性或方法内建在构造函数中,为什么还要用 prototype ?实际上两者有很大的不同。首先,当创建实例时,在构造函数中声明的属性和方法都会被拷贝到每一个被创建的实例中,而 prototype 则不然;其次,如果从构造函数拷贝的属性或方法比较多,那么其间会占用较多的内存,就会降低代码执行的效率,并且带来的一个后遗症是由该类创建的实例体积会成直线上升;而 prototype 因为不需要这个拷贝的过程,所以相应的就没有资源的浪费,对应的实例也就没有多余的"脂肪";最后,在实例中调用一个内建于构造函数内的属性或方法时,该实例会调用其自身从构造函数中拷贝过来的方法,而利用 prototype 对象创建的属性或方法被调用时,则会像前面提及的那样会在该实例的父类的 prototype 对象中寻找该属性或方法。
由于 prototype 实在是太有用了,网上甚至有关于它的网站,在这些网站上大家拿出自己心爱的 prototype 代码(实际上大部分是某个对象的方法)互相交流。可以预见的是,即使是在 Flash MX 2004 中,在相当的一段时间内这个特性还是会被许多人所沿用。
__proto__
一个与 prototype 遥相呼应的属性是 __proto__ (请注意有 proto 两边各有两个下划线),一个实例的 __proto__ 属性指向创建该实例的类的 prototype 对象。比如我们可以用 __proto__ 测试一个实例是否继承于一个制定的类,如图5-3-5:
这里我们创建了一个可复用的函数用于进行判断,两个参数分别为需要判断的实例和类名,代码块的最后两行测试了一个名为 obj 的对象,因为它确实是由 Object 类派生而来,所以运行时我们会看到输出一个 true。
prototype 和 __proto__ 属性的解释 (转)
最新推荐文章于 2024-09-21 01:10:29 发布