【问题标题】:What does this factory prototype code do?这个工厂原型代码是做什么的?
【发布时间】:2012-09-11 23:33:02
【问题描述】:

这段代码有什么作用?我的意思是特别是原型部分。传入的chain对象是CSS名/值对的对象。我认为 defaultFactory 返回一个具有名称值对的对象。我不知道设置原型的作用。

 function addDefaultStyleToProtoChain(chain):Object {
    // If there's a defaultFactory for this style sheet,
    // then add the object it produces to the chain.
    if (defaultFactory != null)
    {
        var originalChain:Object = chain;

        // from here on...
        defaultFactory.prototype = chain;
        chain = new defaultFactory();
        defaultFactory.prototype = null;
     }

     return chain;
  }

这是在 Flex 4.6 SDK 的 CSSStyleDeclaration 类的 addDefaultStyleToProtoChain 方法中

对于上下文,如果:

   var o:Object = new defaultFactory();
   trace(o) // {fontFamily:Arial, color:blue};
   trace(chain) // {color:red, fontWeight:bold}

   defaultFactory.prototype = chain;
   chain = new defaultFactory(); 
   trace(chain) // ???

链等于什么?

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 更新 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
根据下面的答案,这是怎么回事:

// create a function that returns an object
var myDynamicDefinition:Function = function() {
    this.name = "initialvalue";
    trace('this.name='+this.name); // returns this.name=initialvalue
}

var dynamicDefinitionInstance = new myDynamicDefinition(); // create an instance of myDynamicDefinition
trace(ObjectUtil.toString(dynamicDefinitionInstance));// returns name = "initialvalue"

// create a new definition and assign it to our dynamic definitions
var newDefinition = {color:"red", name:"newObjectValue"};
myDynamicDefinition.prototype = newDefinition;

// create a new instance with new definition
var dynamicDefinitionInstance2 = new myDynamicDefinition();  // create an instance of myDynamicDefinition
trace(ObjectUtil.toString(dynamicDefinitionInstance2)); // returns name = "initialvalue" color = "red"

// delete name property instance
delete dynamicDefinitionInstance2.name;
trace(ObjectUtil.toString(dynamicDefinitionInstance2)); // returns name = "newObjectValue" color = "red"

// set prototype to null 
myDynamicDefinition.prototype = null;

// create a new instance 
var dynamicDefinitionInstance3 = new myDynamicDefinition(); 
trace(ObjectUtil.toString(dynamicDefinitionInstance2)); // returns name = "newObjectValue" color = "red"

看起来当原型对象设置为包含同名属性的对象时,新实例上的属性值在创建新实例后不会改变。所以一开始没什么区别。如果该属性被删除,则原型对象上的值将用作 FALLBACK。请参阅上面的示例代码和返回值。

【问题讨论】:

    标签: actionscript-3 apache-flex oop design-patterns prototype


    【解决方案1】:

    我查看了 SDK,发现 defaultFactory 的功能类似于

    newStyleDeclaration.defaultFactory = function():void
    {
        leftMargin = 50;
        rightMargin = 50;
    }
    

    因此,当您将此函数作为构造函数应用到一个对象(通过原型)时,您只需创建一个新对象,该对象已合并第一个对象的属性并在函数中声明。

        var def : Function = function() {
            this.someDefChanges = "someDefChanges";
        }
    
        var o1 = {testValueO2 : "testValueO2"};
        def.prototype = o1;
        var o2 = new def();
        def.prototype = null;
    
        // o1 = {testValueO2: "testValueO2"}
        // o2 = {someDefChanges: "someDefChanges", testValueO2: "testValueO2"}
    

    希望你的问题是正确的

    【讨论】:

      【解决方案2】:

      设置原型基本上会修改一个类,因此从那时起,您实例化该类的任何对象都会获得该类的新版本而不是原始版本。

      假设我的语言有一个本地类 foo。如果我想给 foo 添加一个方法,不只是创建一个扩展 foo 的类,而是实际上将方法添加到 foo 中。我会修改 foo 的原型。因此,在执行该代码之后,所有 foo 实例都有我的新方法。

      通常你不想这样做,它相当于猴子补丁,但如果你正在编写一个框架或 SDK,并且它有很好的文档,你可能很清楚。

      【讨论】:

      • 那么是在现有类中添加属性和方法还是替换现有类?如果它合并到新属性中,如果该方法已经存在怎么办?写完了吗?
      • 我会认为它取代了现有的类,虽然不是真的。它替换了定义现有类的内容,以及这对实现该类的对象意味着什么。是的,您可以覆盖现有方法。我相信这个术语是“重载”方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多