2012-09-11 27 views
1

这段代码做了什么?我的意思是特别与原型部分。链对象传入时是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; 
    } 

这是CSSStyleDeclaration类了Flex SDK 4.6

对于上下文的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) // ??? 

什么呢链平等的吗?

~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UPDATE ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~
基于低于这个答案是什么,是怎么回事:

// 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。查看上面的示例代码和返回值。

回答

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"} 

希望,我收到了你的问题的权利

1

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

因此,让我们说我的语言有一个本地类的foo。如果我想为foo添加一个方法,不仅仅是创建一个扩展foo的类,而是实际将该方法添加到foo。我会修改foo的原型。所以在代码执行后,foo的所有实例都有我的新方法。

通常情况下你不想这样做,它相当于猴子补丁,但是如果你正在编写一个框架或者SDK,并且它有很好的文档记录,那么你可能已经很清楚了。

+0

所以它的属性和方法,以现有的类添加或替换现有的类?如果它在新属性中合并,那么该方法是否已经存在?写完了吗? –

+1

我认为它可以替代现有的类,但不是真的。它取代了定义现有类的定义,以及实现该类的对象的含义。是的,你可以覆盖现有的方法。我相信这个术语是“超载”的方法。 – invertedSpear