【问题标题】:how to correctly clone an object in WinJS如何在 WinJS 中正确克隆对象
【发布时间】:2014-02-13 00:07:59
【问题描述】:

我有这个函数可以在 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;
        }
}

基本上用 2 种方法创建 BiometricSignatureData 类型的对象

  • 重启对象
  • 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

如果我重新启动我的原始对象,第二个(克隆的)也会自行清理,如何正确执行此操作???

感谢支持

【问题讨论】:

  • 我没有遵循所有代码和您的示例,但是您的克隆不处理数组?应该是? stackoverflow.com/questions/4459928/…
  • 我的克隆没有处理其所有数组的副本,它似乎是一个引用副本,因为如果我影响了一个,那么我不知道为什么会影响另一个

标签: object visual-studio-2013 clone winjs


【解决方案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);

【讨论】:

    猜你喜欢
    • 2010-10-18
    相关资源
    最近更新 更多