2017-09-10 20 views
0

メンバー変数のプロパティを別のメンバー変数にコピーしようとしています。どちらも同じタイプです。私は「trackChanges」呼び出すときにブラウザがエラーを示していますthis.originalDataは、実行時に知られていない理由Javascriptメンバーの変数が正しく定義されていますが、未定義のエラーがあります

TypeError: Cannot read property 'hasOwnProperty' of undefined

は、誰かが言うことはできますか?

export class myClass { 

    data: IMyData; 
    originalData: IMyData; 

    trackChanges() { 
    for (const attr in this.data) { 
     if (this.originalData.hasOwnProperty(attr)) { 
     this.originalData[attr] = this.data[attr]; 
     } 
    } 
    } 

    constructor() { 
    this.data.field1 = '123'; 
    this.data.field2 = 12; 
    } 
+0

値を明示的に指定する必要があります。これはTypeScriptの仕組みではなく、 'javascript'と' typescript'タグを混在させたものです。 – lilezek

+0

私のコードのどこかで、私は 'data'のプロパティに値を割り当てます。あなたのポイントに対処していますか? (私はそれを持っているか分からない)私はそれを反映するために私の質問を更新しました。 – TSG

答えて

1

あなたのコードでは、メンバー変数に値を割り当てません。 inをTypescriptで定義すると、メンバーがオブジェクトに存在することをコンパイラに伝えるだけで、宣言時にイニシャライザを使用するか、コンストラクタで、メソッドで、またはメンバの設定にアクセスして外部から値を割り当てるかが決まります:

export class myClass { 

    data: IMyData = {}; // Initialize using an object literal when declaring 
    originalData: IMyData = {}; // Initialize using an object literal when declaring 
    constructor(data: IMyData = {}) { 
     this.originalData = Object.assign({}, this.data) // Create a copy of the original and assign it to the field 
     this.data = data; // Assign data to the field 
    } 
    trackChanges() { 
     for (const attr in this.data) { 
      if (this.originalData.hasOwnProperty(attr)) { 
       this.originalData[attr] = this.data[attr]; 
      } 
     } 
    } 
} 

var myInstance = new myClass({ name: "Jon"}); 
myInstance.data = {}; // External assignment 
+0

'this.originalData = Object.assign({}、this.data)'という行は、 'trackChanges'関数とまったく同じですか?それはずっと簡単です。私はあなたがオブジェクトのコピーを作ることができないと思った(一度に1つのプロパティを割り当てなければならなかった)? – TSG

+0

'Object.assign'はes2015なので、すべてのブラウザで利用できるわけではないかもしれませんが、古いブラウザのためにいくつかのpolyfillを作成してギャップを埋めてください。しかし、そうです、 'Object.assign'は、データの浅いコピーを作成します。あなたの実装は 'data'から' originalData'へのコピーのみを行います。 'originalData'がすでにプロパティを持っている場合にのみ' Object.assign'はすべての 'data'を新しいオブジェクト(この場合は' {} ')にコピーします。 –

+0

その機能を調査しました。これは、深いコピー(オブジェクトにオブジェクトを入れ子にしたもの)の方が良いでしょうか? 'copyobj = JSON.parse(JSON.stringify(firstobj)); – TSG

関連する問題