【问题标题】:How can I translate keyword prototype in AS3 to Haxe?如何将 AS3 中的关键字原型翻译成 Haxe?
【发布时间】:2022-01-05 17:56:35
【问题描述】:

我有下面的 AS3 代码,我想把它翻译成 Haxe。但是我不知道如何处理关键字prototype。谁能帮我?谢谢。

    var style = new CSSStyleDeclaration(); 
    style.defaultFactory = function():void
    {
       this.disabledOverlayAlpha = 0;
       this.borderStyle = "controlBar";
       this.paddingTop = 10;
       this.verticalAlign = "middle";
       this.paddingLeft = 10;
       this.paddingBottom = 10;
       this.paddingRight = 10;
    };
    if(chain == null) chain = {};
    style.defaultFactory.prototype = chain;
    chain = new style.defaultFactory();
    
    style.defaultFactory = function():void
    {
       this.fontWeight = "bold";
    };

    style.defaultFactory.prototype = chain;
    chain = new style.defaultFactory();

    style.defaultFactory = function():void
    {
           this.backgroundSize = "100%";
           this.paddingTop = 24;
           this.backgroundColor = 8821927;
           this.backgroundImage = ApplicationBackground;
           this.horizontalAlign = "center";
           this.backgroundGradientAlphas = [1,1];
           this.paddingLeft = 24;
           this.paddingBottom = 24;
           this.paddingRight = 24;
      };

     style.defaultFactory.prototype = chain;
     chain = new style.defaultFactory();

【问题讨论】:

  • prototype 关键字是使用继承的一种非常简单的方式(如果是 AS3,更像是 AS1/ 2): help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/… 我建议你(而不是直接将其移植到 HAXE)弄清楚这段代码到底做了什么并移植了它的 有意义 版本.
  • 另外一个问题,defaultFactory是一种Function,Haxe不支持new defaultFactory()
  • 只有更多的理由去理解这篇文章应该做什么,并以合法的 HAXE 方式重新编写它,而不是试图将它移植到副本中方式。
  • @PeterZhou "Haxe 不支持新的 defaultFactory()" 是否可以创建一个新的类而不是函数?关键字prototype 是创建inline 函数的快捷方式(在另一个现有函数中添加一些新函数)。无论 defaultFactory 是函数还是类,无论哪种方式,您都将以defaultFactory.chain(); 访问内联/原型链函数,但只有类可以拥有new。为什么在显示的代码中需要它超出了我的范围...chain = new defaultFactory(); 意味着您希望一个名为 chain 的函数也包含一个名为 chain 的内联函数?喜欢chain.chain();???
  • 大家好,我使用AS3HX工具将AS3代码翻译成HAXE。但是,HAXE 代码中存在无穷无尽的错误。 AS3HX 不知道如何将上面的代码翻译成HAXE,它只是直接将代码复制到HAXE。没有chain()方法,chain是一个对象,相当于new defaultFactory(),链接到另一个defaultFactory。谁有使用 AS3HX 的经验?

标签: actionscript-3 ecmascript-6 haxe


【解决方案1】:

好的,我稍微戳了一下,现在我有点想通了,那段代码的作用。这些知识不会帮助您将代码移植到 HAXE,但它帮助您了解它的含义并编写一个体面的 HAXE 风格的替代品。

首先,关于实例化、函数和使用原型的部分。事实证明,如果您在未绑定的函数上调用 new 运算符(不适用于类方法):

  1. 新的空无类泛型 Object 已创建。
  2. 它的引用作为this传递给上述函数。
  3. 该函数可以添加和修改对象的字段和方法。
  4. 最终,返回对该 Object 的引用。

然后,它的工作方式(正如我在上面的 cmets 中提到的)非常类似于当时在 AS1Flash 6 中的类工作方式。

如果那个函数有一个prototype,而且它也是一个通用的Object,那么它就会被添加到新创建的那个...... .. bottomObject 将其字段添加到 topObject

我知道这听起来很困难,所以有一个解释性的例子可以以某种方式阐明这一切:

public class Proton extends Sprite
{
    
    public function Proton() 
    {
        super();
        
        var P:Function;
        
        // Empty.
        P = new Function;
        create("First:", P);
        
        // Empty with prototype.
        P.prototype = {c:3, d:4};
        create("Second:", P);
        
        // Non-empty.
        P = function():void
        {
            this.a = 1;
            this.b = 2;
        };
        create("Third:", P);
        
        // Non-empty with prototype.
        P.prototype = {a:5, f:6};
        create("Fourth:", P);
    }
    
    // Instantiates the F and outputs the result.
    private function create(prefix:String, F:Function):void
    {
        var A:Object = new F;
        
        trace(prefix + "\nJSON:" + JSON.stringify(A) + "\nREAL:" + explore(A) + "\n");
    }
    
    // Same as JSON.stringify, but also looks into the prototype.
    private function explore(O:Object):String
    {
        var result:Array = new Array;
        
        for (var akey:String in O)
        {
            result.push('"' + akey + '":' + O[akey]);
        }
        
        return "{" + result.join(",") + "}";
    }
}

所以,输出是:

First:
JSON:{}
REAL:{}

Second:
JSON:{}
REAL:{"d":4,"c":3}

Third:
JSON:{"b":2,"a":1}
REAL:{"b":2,"a":1}

Fourth:
JSON:{"b":2,"a":1}
REAL:{"b":2,"a":1,"f":6,"a":1}

如你所见,JSON.stringify只导出top层对象,而直接for迭代遍历所有层,top 到 bottom,甚至处理重复的键(但 top 层的值会影响下面的内容)。

第二,这一切与你的代码有什么关系。这些 factorydefaultFactory 函数在一些与 CSS 相关的类中用于形成样式的 Object 表示: https://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/styles/CSSStyleDeclaration.html

因此,您可以使用 prototype hack 来形成一个通用的 Object,其中包含 chain 层层叠叠的 CSS 声明...可能。你看到 JSON 除了 top 层什么都感知不到,我不知道 CSS 类的行为是否不同。

我认为,使用 CSS 应该更简单,更直接。

祝你好运。

【讨论】:

  • 谢谢,但我不知道如何使用 HAXE 构建 defaultFactory 链。我知道 Javascript 非常简单,因为 Javascript 支持原型和新函数。我添加了另外两个 defaultFactory 函数,并让您知道代码含义。你能用HAXE构造一个defaultFactory链吗?
  • 正如我在上面已经告诉过您的,您应该停止尝试将其复制到 HAXE。您拥有的脚本构建(现在可见)一个 CSS 描述对象,不是一次性而是通过合并多个对象(即它们的链),其中一些具有相同的属性(参见paddingTop) 掩盖了早期对象中的相关属性。所以,有两件事要做:1)图,如何在没有 CSSStyleDeclaration 类的情况下应用 CSS 和 2)以其他方式构建 CSS 对象比这个原型疯狂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 2016-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多