2014-02-13 4 views
1

У меня есть эта функция для создания объектов в WinJS:как правильно клонировать объект в WinJS

function BiometricSignatureData() { 
    this.averageSpeed  = ""; 
    this.pressure   = new Array(); 
    this.location   = new Array(); 
    this.timestamp   = new Array(); 
    this.speed    = new Array(); 
    this.evt    = new Array(); 
    this.spaces    = 0; 
    this.attackPoints  = 0; 
    this.finalPoints  = 0; 
    this.signatureAddress = ""; 


    this.restartObject = 
     function() { 
      this.pressure   = new Array(); 
      this.location   = new Array(); 
      this.timestamp   = new Array(); 
      this.averageSpeed  = ""; 
      this.speed    = new Array(); 
      this.evt    = new Array(); 
      this.spaces    = 0; 
      this.attackPoints  = 0; 
      this.finalPoints  = 0; 
      this.signatureAddress = ""; 
     } 
    this.printBiometricValuesOnRealTime = 
     function (pressure, location, averageSpeed, spaces, attackPoints, finishPoints) { 

      pressure.value    = this.pressure[this.pressure.length -1]; 
      location.value    = "{" + this.location[this.location.length - 1] + "}"; 
      averageSpeed.value   = this.averageSpeed; 
      spaces.value     = this.spaces; 
      attackPoints.value   = this.attackPoints; 
      finishPoints.value   = this.finalPoints; 
     } 
} 

Основном создает объекты BiometricSignatureData типа с 2-мя методами

  • restartObject
  • printBiometricValuesOnRealTime

, а затем я создал два экземпляра одного и того же объекта

var biometricObject   = new BiometricSignatureData(); 
var biometricObjectBackup = new BiometricSignatureData(); 

мой первый экземпляр (biometricObject) заполняется данными, то я хочу, чтобы клонировать (а не по ссылке) этот экземпляр в моей второй инстанции (biometricObjectBackup), делая это:

function cloneObject(from, to) {// extends 'from' object with members from 'to'. If 'to' is null, a deep clone of 'from' is returned 
       if (from == null || typeof from != "object") return from; 
       if (from.constructor != Object && from.constructor != Array) return from; 
       if (from.constructor == Date || from.constructor == RegExp || from.constructor == Function || 
        from.constructor == String || from.constructor == Number || from.constructor == Boolean) 
        return new from.constructor(from); 
       to = to || new from.constructor(); 
       for (var name in from) { 
        to[name] = typeof to[name] == "undefined" ? cloneObject(from[name], null) : to[name]; 
       } 
       return to; 
      } 

заполнение второй экземпляр с первой инстанцией информацией

console.log("original Array: " + biometricObject.evt.length + ", backup Array: " + biometricObjectBackup.evt.length); 
biometricObjectBackup = cloneObject(biometricObject); 

console.log("original Array: " + biometricObject.evt.length + ", backup Array: " + biometricObjectBackup.evt.length); 
biometricObject.restartObject(); 
console.log("original Array: " + biometricObject.evt.length + ", backup Array: " + biometricObjectBackup.evt.length); 

поставил три console.log следить за поведением объектов, получающих следующий вывод:

original Array: 10, backup Array: 0 
original Array: 10, backup Array: 10 
original Array: 0, backup Array: 0 

Если я перезапущу свой оригинальный объект, второй (клонированный) очистит себя, как это сделать правильно ???

спасибо за поддержку

+0

Я не следую с весь код и ваш пример, но ваш клон не обрабатывает массивы? Должно ли это? http://stackoverflow.com/questions/4459928/how-to-deep-clone-in-javascript – WiredPrairie

+0

мой клон не обрабатывал копию всех его массивов, похоже, это была копия по ссылке, потому что, если бы я затронул один, затем повлиял на другой, я не знаю, почему –

ответ

1

вы можете попробовать это:

var BiometricSignatureData = { 
    averageSpeed:  "", 
    pressure:   new Array(), 
    location:   new Array(), 
    timestamp:   new Array(), 
    speed:    new Array(), 
    evt:    new Array(), 
    spaces:    0, 
    attackPoints:  0, 
    finalPoints:  0, 
    signatureAddress: "", 


    restartObject : 
     function() { 
      this.pressure   = new Array(); 
      this.location   = new Array(); 
      this.timestamp   = new Array(); 
      this.averageSpeed  = ""; 
      this.speed    = new Array(); 
      this.evt    = new Array(); 
      this.spaces    = 0; 
      this.attackPoints  = 0; 
      this.finalPoints  = 0; 
      this.signatureAddress = ""; 
     }, 

    printBiometricValuesOnRealTime: 
     function (pressure, location, averageSpeed, spaces, attackPoints, finishPoints) { 

      pressure.value   = this.pressure[this.pressure.length - 1]; 
      location.value   = "{" + this.location[this.location.length - 1] + "}"; 
      averageSpeed.value  = this.averageSpeed; 
      spaces.value   = this.spaces; 
      attackPoints.value  = this.attackPoints; 
      finishPoints.value  = this.finalPoints; 
     } 
} 


var BiometricSignatureDataBackup; 

клон функция таким же

и последняя часть:

BiometricSignatureDataBackup = cloneObject(BiometricSignatureData); 

    console.log("original Array: " + biometricObject.evt.length + ", backup Array: " + biometricObjectBackup.evt.length); 
    BiometricSignatureData.restartObject(); 
    console.log("original Array: " + BiometricSignatureData.evt.length + ", backup Array: " + BiometricSignatureDataBackup.evt.length); 
+0

работал !!! благодаря!!! –

Смежные вопросы