0

継承とプロトタイプチェーンを含む最初のJSプロジェクトに取り組んでいますが、特定のデータを使用して1つのオブジェクトを作成すると、2番目のオブジェクトに既に配置されているデータに影響する理由について混乱しています。目標は、「親」オブジェクトのfull_paramsオブジェクトリテラルに一連の基本的なデフォルトを設定し、「子」オブジェクトのdefault_paramsオブジェクトリテラルにいくつかのより具体的なデフォルトを設定することです。子オブジェクトspecificRequestは、コンストラクター関数の配列引数を取り、それらをdefault_paramsに追加してから、プロトタイプのsetOptions関数を呼び出してfull_paramsに追加します。

問題は、1つのspecificRequestオブジェクトを作成して初期化すると正常に機能することですが、2番目のspecificRequestオブジェクトを作成すると、full_paramsはすでに最初のオブジェクトと同じです。

これは、プロトタイプがどのように機能するかについての誤解から、おそらく非常に単純なものです...

/////// PARENT OBJECT

function baseRequest(custom_params) {

    var key;

    this.full_params = {
        "SignatureVersion": "2",
        "Timestamp": Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd'T'HH:mm:ss'Z'")
    };

    this.custom_params = custom_params;

}


baseRequest.prototype.setOptions = function(arg_options) {
    var key;

    if (typeof arg_options === "object") this.custom_params = arg_options;

    // If an object of request options is passed, use that. Otherwise use whatever is already in the custom_params object.
    for (key in this.custom_params) {
        this.full_params[key] = this.custom_params[key];
    }

}





///////// CHILD OBJECT

function specificRequest(mySKUList) {
    var i;
    this.mySKUList = mySKUList;

    this.default_params = {
        "Action": "myAction",
        "Version": "2011-10-01"
    };

    for (i = 0; i < this.mySKUList.length; i++) {
        var temp_sku = this.mySKUList[i];
        var temp_sku_name = "SellerSKUList.SellerSKU." + (i + 1);
        this.default_params[temp_sku_name] = temp_sku;
    }

    this.setOptions(this.default_params);
}

specificRequest.prototype = new baseRequest






///// Function to run

function testfoo() {

    var skulist1 = ["AR6100", "AR6102", "WB1234"]
    var skulist2 = ["XY9999"]

    var req1 = new specificRequest(skulist1);
    var req2 = new specificRequest(skulist2);

    // Req1 has AR6100, AR6102, and WB1234 as parameters, as expected
    // Req2 should only have XY9999, but instead has XY9999, AR6102, and WB1234
}
4

1 に答える 1

1

次の行で、親クラスの具体的なインスタンスを子クラスのプロトタイプに関連付けました。

specificRequest.prototype = new baseRequest

代わりに、親クラスをまったくインスタンス化しないでください。

specificRequest.prototype = Object.create( baseRequest.prototype );

また、super()子インスタンスを構築するときに同等のものを呼び出します。

function specificRequest(mySKUList) {
     baseRequest.call( this );

     ...
}

また、コンストラクタ名は大文字で始めてください。

于 2012-12-21T01:40:41.657 に答える