这段代码有什么作用?我的意思是原型部分。传入的链对象是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) // ???
链是什么相等?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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。请参阅上面的示例代码和返回值。
答案 0 :(得分:1)
设置原型基本上修改了一个类,因此从那时起,您实例化该类的任何对象都将获得该类的新版本而不是原始版本。
所以我要说我的语言有一个本地类的foo。如果我想为foo添加一个方法,不只是创建一个扩展foo的类,而是实际将方法添加到foo。我会修改foo的原型。所以在执行代码之后,foo的所有实例都有我的新方法。
通常你不想这样做,它等同于猴子补丁,但是如果你正在编写一个框架或SDK,并且它有很好的文档记录,你可能很清楚。
答案 1 :(得分: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"}
希望,我的问题是对的