O.K。,我在他们自己的.AS文件中创建了这两个类(foo
和bar
)。这两个类都保存在名为custom
的包中。
在我称为“Sandbox”的.FLA文件中,我将以下代码放在时间轴中:
import custom.foo;
import custom.bar;
var f:foo = new foo("FOO");
var b:bar = new bar("BAR");
trace(f.valueOf());
trace(b.valueOf());
f.statement();
b.statement();
我得到了以下输出:
FOO
BAR
声明:值为FOO
声明:值为BAR
现在,通常,我不会想太多,但看看类的代码......
这是foo.as
文件(减去我的评论):
package custom {
public class foo {
public var property:String;
public var value:String;
public function foo (par:String = "?") {
this.property = par;
this.value = this.valueOf();
return;
}
prototype.expression = function () {
trace ("Expression: the value is", this.property);
}
public function statement () {
trace ("Statement: the value is", this.property);
}
public function valueOf() {
return(this.property);
}
}
}
...这里是bar.as
文件(减去我的评论):
package custom {
public class bar {
public var property:String;
public var value:String;
public function bar (par:String = "?") {
prototype.property = par;
prototype.value = prototype.valueOf();
return;
}
prototype.expression = function () {
trace ("Expression: the value is", prototype.property);
}
public function statement () {
trace ("Statement: the value is", prototype.property);
}
public function valueOf() {
return(prototype.property);
}
}
}
当我使用prototype
代替this
时,为什么会得到相同的结果?
我发现,虽然这是一个令人烦恼的问题,但除非有人能告诉我prototype
实际上意味着什么,否则无法回答。
我知道this
大致翻译为“此类的此类实例”,但是...... prototype
的意思是什么?
答案 0 :(得分:1)
ActionScript 3基于ECMAScript规范(正式为ECMA-262),它指定了与JavaScript相同的标准。
基本上,规范将对象的prototype
属性描述为一种蓝图,用于在使用new
创建时定义该对象的新实例的初始属性。您可以将prototype
理解为包含任何字段和方法(或function
,如果需要)的定义的类对象,这些对象在幕后>期间复制到每个实例-new
。
调用方法或访问prototype
上的字段将调用原始函数或将访问“类”对象的原始字段,而不是复制到实例中的方法或字段。因此,您始终会从protoype.property
获得相同的值,但与f.property
和b.property
不同,因为它们分别是foo
和bar
的实例,使用{new
创建prototype
和public class Sample {
public function Sample() {
trace("this.test():", this.test()); // output: this.test(): member test
trace("this["test"]():", this["test"]()); // output: this["test"](): member test
}
public function test():String {
return "member test";
}
}
public class SampleWithPrototype {
public function SampleWithPrototype() {
trace("this.test():", this.test()); // COMPILER ERROR: there is no member 'test' defined.
trace("this["test"]():", this["test"]()); // output: this["test"](): prototype test
}
prototype.test = function():String {
return "prototype test";
}
}
public class SampleWithBoth {
public function SampleWithBoth() {
trace("this.test():", this.test()); // output: this.test(): member test
trace("this["test"]():", this["test"]()); // output: this["test"](): member test
}
public function test():String {
return "member test";
}
prototype.test = function():String {
return "prototype test";
}
}
{1}}。
了解prototype
的一些特殊行为如下。
首先,三个例子解释使用原型和普通成员的差异:
this["test"]
现在解释:.
对象的复制实例属性只能在实例上访问,只能使用下标运算符(示例中为SampleWithPrototype
)。它们在编译期间不会被检查,只能以这种方式访问。使用prototype
- 表示法访问它会引发编译时错误(public function ...
)。
使用protopype
定义成员和使用SampleWithBoth
等常规成员定义机制的成员时,常规定义的成员会隐藏prototype.test
- 成员,因此它变得无法访问({{ 1}})。
此外:您可以在运行时期间用任何您想要的内容覆盖test
,因此在dynamic
被覆盖后从类中创建的每个实例都会提供新的行为。而且您不需要使用prototype
标记您的课程。
最后:我不建议使用此功能,因为它会使您的应用程序无法预测且难以调试。除非将编译器切换到(慢得多)ECMA标准模式(即非严格模式),否则在ActionScript中使用{{1}}并不常见。然后,您将获得与JavaScript中相同的行为。
答案 1 :(得分:0)
根据官方文件:
<强> [Top Level] Object.prototype 强>
对类或函数对象的原型对象的引用。该 prototype属性自动创建并附加到任何类 或您创建的函数对象。这个属性是静态的 特定于您创建的类或函数。例如,如果 你创建一个类,原型属性的值是由共享的 类的所有实例,只能作为类属性访问。 您的类的实例无法直接访问原型属性。
类的原型对象是该类的特殊实例 提供了一种在a的所有实例之间共享状态的机制 类。在运行时,在类实例上找不到属性时, 委托,它是类原型对象,检查它 属性。如果原型对象不包含该属性,则 进程继续进行原型对象的委托签入 层次结构中的连续更高级别,直到Flash运行时 找到了财产。
注意:在ActionScript 3.0中,原型继承不是主要的 继承机制。类继承,驱动 在类定义中继承固定属性,是主要的 ActionScript 3.0中的继承机制。
答案 2 :(得分:0)
AS3&amp; Javascript派生自相同的ECMAScript。
在javascript中,原型作为扩展对象的唯一手段而存在。编写面向对象的JS。
它在AS3中也具有相同的含义。但是在AS3中,Adobe编写了类结构,渲染了原型灭绝的使用。所以在AS3你写的课程&amp;像在C#/ Java等任何流行的oop语言中一样使用它们。