2011-12-09 31 views
3

ここでは、Dataのすべてのプロパティを元の値にリセットしたいのですが、どうしたらいいですか?このJSオブジェクトをリセットするには?

var Data = { 
    prop1: false, 
    prop2: true, 
    prop3: null 
} 

Some code executes & sets Data.prop1 = "abc"; 

私は決してデータをインスタンス化しませんでした、それは問題ですか?

+1

いいえ、= after Dataを持たないと問題です。 var data = {};でなければなりません。 –

+0

カスタムコンストラクタを使用してオブジェクトを作成していますか?もしそうなら、デフォルトがプリミティブであれば、 'prototype'にデフォルトを置いて、インスタンスのプロパティを' delete'してデフォルトに戻すことができます。 – RightSaidFred

+0

欠落している=と誤っていると仮定すると、そのコードは実際のオブジェクトを作成します。オブジェクトのインスタンスを作成することはありません(インスタンス化のクラスベースのOO言語の意味ではありません)。 – nnnnnn

答えて

6

もう一つの方法は、このようになります:

var Data = { 
    prop1: false, 
    prop2: true, 
    prop3: null, 

    // save initial values 
    init: function() { 
     var origValues = {}; 
     for (var prop in this) { 
      if (this.hasOwnProperty(prop) && prop != "origValues") { 
       origValues[prop] = this[prop]; 
      } 
     } 
     this.origValues = origValues; 
    }, 
    // restore initial values 
    reset: function() { 
     for (var prop in this.origValues) { 
      this[prop] = this.origValues[prop]; 
     } 
    } 
} 

あなたがそれを使用するとき、彼らはData.reset()して後で復元できるように続いて、現在の値を保存するために、あなたの初期化コードでData.init()を呼び出します。これはメンテナンスが容易であるという利点を有する。変数をデータ構造体に追加または変更すると、特定の変更を加えることなく、自動的にリセット機能に組み込まれます。

ここで動作することがわかります:http://jsfiddle.net/jfriend00/EtWfn/

10

Dataは、dynamicオブジェクトです。あなただけのすべての値をリセットする機能を追加することができます。

var Data = { 
    prop1: false, 
    prop2: true, 
    prop3: null, 
    reset: function() { 
     this.prop1 = false; 
     this.prop2 = true; 
     this.prop3 = null; 
    } 
} 
+0

また、関連性:http://stackoverflow.com/questions/8231730/closures-in-auto-executing-functions -vs-objectsあなたは 'new'を使う必要はありませんが、場合によってはそうしたいかもしれません。 – Halcyon

1

はそれを試してみてください。

var Data = { 
    prop1: false, 
    prop2: true, 
    prop3: null 
} 

var DataOriginal = { 
    prop1: false, 
    prop2: true, 
    prop3: null 
} 

Data.prop1 = 'abc'; 

Data = DataOriginal; 
+1

'Data = DataOriginal'はオブジェクトのコピーを作成しないため、同じオブジェクトに両方の変数を指しているだけなので、複数回再設定する必要がある場合はこれは機能しません。 – nnnnnn

0

は十分に簡単に聞こえます。これはあなたのために働くでしょうか?

// after the Data structure is defined copy it to another variable 
var OriginalData = Data; 

// When you need to reset your Data to the Original values 
Data = OriginalData; 
+0

これは動作しません。 Dataオブジェクトをコピーせず、same_オブジェクトへの別の参照を作成します。 – nnnnnn

+0

私はこれをお勧めしません。 OriginalDataとDataは同じオブジェクトを参照します。 OrigianlDataが決して別のオブジェクトに参照されないと、何もリセットされません。それ以外の場合は動作します。 –

3

すべてのデフォルト値を複製する必要がなくなり最も簡単な方法は、単に、より伝統的なコンストラクタを使用して、そこから自分のデータオブジェクトをインスタンス化することです。その後、リセットする必要がある場合は、古いオブジェクトを破棄して新しいオブジェクトをインスタンス化することができます。

注:次のコードでは、オブジェクトコンストラクタとして使用される関数が大文字で始まり、インスタンスを参照する変数が小文字で始まるJS規約を使用しました。

function Data() { 
    this.prop1 = false; 
    this.prop2 = true; 
    this.prop3 = null; 
} 

var data = new Data(); 

data.prop1 = "abc"; // change some properties of data 
data.prop3 = "something else"; 

data = new Data(); // "reset" by getting a new instance 

あなたはあなただけのオブジェクトを返す非コンストラクタ形式の関数記述することもでき、「新」を使用する必要が好きではない場合:何らかの理由であなたがにリセットが必要な場合

function getData() { 
    return { 
     prop1: false, 
     prop2: true, 
     prop3: null 
    }; 
} 

var data = getData(); 
data.prop1 = "abc"; 

data = getData(); // reset 

を新たな同一インスタンスを取得するのではなく、同じ実際のインスタンスを維持する必要があります.Frits van Campenの答えに従ってプロパティを1つずつ変更する必要があります(追加のプロパティを削除する必要があります方法)。それを行うには

2

参照を失うことなく、デフォルト値をコピーするよりエレガントな方法:

function createData() { 
    return { 
    prop1: 1, 
    prop2: 2, 
    prop3: [3] 
    reset: function() { 
    Object.assign(this, createData()) 
    } 
} 
} 

var data = createData() 
data.prop1 = "not default anymore" 
data.reset() 
console.log(data.prop1) // 1 

に前述したように、あなたはまだこのような場合には、後に追加されたプロパティを削除する必要があります。

関連する問題