【问题标题】:Are classes methods created individually for instances?是否为实例单独创建类方法?
【发布时间】:2017-03-06 05:09:48
【问题描述】:

我想知道在 ActionScript 3 中是否有一种方法可以在类定义的实例之间共享相同的函数(方法),每次只引用相同的函数...即,此示例应记录 true,但是登录false(注意:我希望这可以减少重复功能)。

class A {
    function f() {}
}

trace(
    (new A).f === (new A).f
)

ActionScript 3 语言规范似乎表明存在 prototype 属性,但未实现。我知道各个类都有一个原型对象。我专门找到了一个原型属性(可能继承自Class/Object)并且想知道类是否使用元函数来构造(因为它们的类型是“对象”......当我用typeof进行测试时:@ 987654327@).

我的最后一次尝试:

class A {}

A.prototype.f = function() {}

trace(
      (new A).f === (new A).f
)

它说f 不存在。我可以将这个类定义为一个函数(以便将方法移动到原型对象):

function A() {}

A.prototype.f = function() {}

,但是这样我无法控制实例成员的访问。

【问题讨论】:

  • 看来你已经回答了你自己的问题,new A().f === new A().ffalse。但是:I'd want this to reduce duplicating functions -- 为什么你想以这种方式减少“重复功能”?您认为这将是性能优化吗?它是否解决了您遇到的一些问题,例如比较两个对象的相等性?
  • @Aaron 为什么要以这种方式减少“重复功能”?,正是为了获得性能优化。 它是否解决了您遇到的一些问题,例如比较两个对象的相等性?,不是这个比较,而是减少每个实例创建的函数。如果我要多次使用各种方法构造一个类,那么它可能会很慢,不是吗?
  • @Aaron 我的意思是,不必为每个实例创建类定义的每个实例方法,它可以只是在类原型上并在对象之间共享实例。如果new A().f === new A().f 给了我false,那么它只是意味着这两个函数引用指向不同的函数(这意味着该方法可能被绑定或者是的,重新创建)。
  • @handoncloud 类方法绑定到类实例,这正是当您 == 比较方法引用时它们输出 false 的原因。当您创建一个类的新实例时,类方法不会“复制”或复制或其他。请不要想太多。如果您碰巧遇到代码运行速度过慢的特定问题,请优化代码,总有很多方法。
  • @Organis 不,我没有任何代码运行缓慢。我还没有计划任何东西。而且我认为绑定方法是个坏主意

标签: actionscript-3


【解决方案1】:

AS3 使用Bound methods 确保在您的函数内部,this 默认始终指向原始实例对象。

假设您将实例a 的函数f 传递给其他对象b。当对象b 调用函数f 时,this 名称仍指向函数范围内的a - 此引用必须存储在某处。

好吧,您可以将函数分配给您的类的静态属性:

package adnss.projects.evTest 
{

    public class A {

        private var x:Number = 5;
        private var _y:Number = 0;

        public function A(){}

        static public const f = function (p:Number):Number {
            this._y = p;
            return this.x*p;        
        }

        public function get y():Number { return _y; }
    }
}

然后通过显式使用this 访问该静态函数中A 实例的私有属性:

var instance:A = new A();
trace("return:", A.f.call(instance, 3)); //return: 15
trace("instace:", instance.y); //instance: 3

但这对于可能的好处(如果有的话)有点棘手。

关于原型。您基本上不会在 AS3 中使用它们。有没有像纪念品一样的:) - read this for more info

【讨论】:

    猜你喜欢
    • 2018-11-23
    • 2012-12-25
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 2011-08-23
    • 2018-07-26
    相关资源
    最近更新 更多