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

これは、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 として使用されます。上記のコード例と戻り値を参照してください。

4

2 に答える 2

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

うまくいけば、私はあなたの質問を正しく理解しました

于 2012-09-13T20:50:54.590 に答える
1

プロトタイプを設定すると、基本的にクラスが変更されるため、その時点以降、そのクラスのインスタンス化するオブジェクトは、元のクラスではなく新しいバージョンのクラスを取得します。

つまり、私の言語に foo のネイティブ クラスがあるとしましょう。foo にメソッドを追加したい場合は、foo を拡張するクラスを作成するだけでなく、実際にメソッドを foo に追加します。foo のプロトタイプを変更します。したがって、そのコードが実行された後、foo のすべてのインスタンスに新しいメソッドが含まれます。

通常、これはやりたくありません。モンキー パッチを適用するのと同じですが、フレームワークまたは SDK を作成していて、十分に文書化されている場合は、おそらく明確です。

于 2012-09-12T00:50:13.143 に答える