将javascript(jQuery)对象属性返回到默认状态

将javascript(jQuery)对象属性返回到默认状态,javascript,jquery,object,Javascript,Jquery,Object,我正在使用构建一个模式中的小测验,它几乎完成了。测验末尾有一个按钮,上面写着“再试一次”,这将重新启动测验,我很难想出一个简单的方法将设置属性(应用程序的变量列表)重置为默认值 这就是我现在拥有的: jQuery(function($) { var s, QuizApp = { settings: { timer: null, isPaused: false,

我正在使用构建一个模式中的小测验,它几乎完成了。测验末尾有一个按钮,上面写着“再试一次”,这将重新启动测验,我很难想出一个简单的方法将设置属性(应用程序的变量列表)重置为默认值

这就是我现在拥有的:

jQuery(function($) {
    var s,
        QuizApp = {
            settings: {
                timer: null,
                isPaused: false,
                count: null,
                correctAnswer: null,
                score: 0,
                questionCounter: 1
            },

            init: function() {
                s = this.settings;
                this.questionsGet();
                this.bindUIActions();
            },

            // Code omitted for event handlers and such

            resetQuiz: function() {
                s.timer = null;
                s.isPaused = false;
                s.count = null;
                s.correctAnswer = null;
                s.score = 0;
                s.questionCounter = 1;
            },
        },
}; $(function() {
    QuizApp.init();
});
}))

不是很干——实际上相当糟糕。我想要的是:

jQuery(function ($) {
    var s,
        QuizApp = {
            settings: {
                timer: null,
                isPaused: false,
                count: null,
                correctAnswer: null,
                score: 0,
                questionCounter: 1,
                defaults: { /* pseudo code to store settings here */ }
            },
            resetQuiz: function () {
                s = s.defaults // pseudo code to reset the settings to the value stored in defaults
            },
        };
    $(function () {
        QuizApp.init();
    });
});
或者更好的,如果你能想到的话。我已经搜索了大量的“重置对象属性”和“克隆对象属性”,但没有找到任何解释如何执行此操作的内容。显然,jQuery是可以使用的


此外,我不了解如何/在何处存储数据以及如何将数据映射回,因为我不完全了解这是什么类型的数据(“设置”是对象属性,它的值是子属性?还是多维数组?我应该存储哪些数据以便稍后检索其默认值?等等),因此,任何类型的深入解释或链接到我们正在处理的数据类型的信息都是一个额外的好处

在QuizApp之外创建一个名为defaults的变量,并为其指定默认值

然后当您声明QuizApp
settings:$.extend({},默认值)

然后在函数中声明
s=$.extend({},默认值)

我还建议使用

; (function($){

    "strict mode";

})();
这将防止与覆盖外部变量发生冲突

; (function(){
"strict mode";

jQuery(function($) {
var s,
    defaults = {
        timer: null,
        isPaused: false,
        count: null,
        correctAnswer: null,
        score: 0,
        questionCounter: 1
    },
    QuizApp = {
        settings: $.extend({},defaults),

        init: function() {
            s = $.extend({},defaults);
            this.questionsGet();
            this.bindUIActions();
        },

        resetQuiz: function() {
           s = $.extend({},defaults); // pseudo code to reset the settings to the value stored in defaults
        },

    };
$(function() {
    QuizApp.init();
});

})(jQuery);

在QuizApp之外创建一个名为defaults的变量,并为其指定默认值

然后当您声明QuizApp
settings:$.extend({},默认值)

然后在函数中声明
s=$.extend({},默认值)

我还建议使用

; (function($){

    "strict mode";

})();
这将防止与覆盖外部变量发生冲突

; (function(){
"strict mode";

jQuery(function($) {
var s,
    defaults = {
        timer: null,
        isPaused: false,
        count: null,
        correctAnswer: null,
        score: 0,
        questionCounter: 1
    },
    QuizApp = {
        settings: $.extend({},defaults),

        init: function() {
            s = $.extend({},defaults);
            this.questionsGet();
            this.bindUIActions();
        },

        resetQuiz: function() {
           s = $.extend({},defaults); // pseudo code to reset the settings to the value stored in defaults
        },

    };
$(function() {
    QuizApp.init();
});

})(jQuery);

如果您真的不想保留具有默认值的对象的第二个副本,我认为您正在寻找类似的内容:

function PropertyHolder (defaultValue) {
    this.defaultValue = defaultValue;
    this.currentValue = defaultValue;
}

PropertyHolder.prototype.reset = function () {
    this.currentValue = this.defaultValue;
};

PropertyHolder.prototype.setValue = function (newValue) {
    this.currentValue = newValue;
};

PropertyHolder.prototype.getValue = function () {
    return this.currentValue;
};

function Settings (settings) {
    for( var key in settings ) {
        this[key] = new PropertyHolder( settings[key] );
    }
};

Settings.prototype.reset = function () {
    for( var key in this ) {
        if( this[key] instanceof PropertyHolder ) {
            this[key].reset();
        }
    }
};

var settings = new Settings( {
    valueA: 42,
    valueB: ["Hello", "World"]
} );

console.log( settings.valueA.getValue() ); // 42
settings.valueA.setValue( -1 );
console.log( settings.valueA.getValue() ); // -1
settings.reset();
console.log( settings.valueA.getValue() ); // 42
正如大多数事情一样,这可以得到极大的改进。这只是为了让大家明白这个想法。不过,对于一个简单的小设置对象,我认为只保留默认值的第二个副本没有任何问题。它可能有点重复,但在这种情况下,它并没有那么糟糕

但是,这也可能有助于您避免重复:

var defaults = {
    'valueA': 42,
    'valueB': ["Hello", "World"]
};

var settings = {};

var getSetting = function (setting) {
    return typeof settings[setting] !== 'undefined' ? settings[setting] : defaults[setting];
};
var resetSettings = function () {
    settings = {};
};

console.log( getSetting( 'valueA' ) ); // 42
settings['valueA'] = -1;
console.log( getSetting( 'valueA' ) ); // -1
resetSettings();
console.log( getSetting( 'valueA' ) ); // 42

我不太喜欢使用字符串标识符,但大多数人似乎并不介意。

如果您真的不想保留具有默认值的对象的第二个副本,我认为您正在寻找类似的内容:

function PropertyHolder (defaultValue) {
    this.defaultValue = defaultValue;
    this.currentValue = defaultValue;
}

PropertyHolder.prototype.reset = function () {
    this.currentValue = this.defaultValue;
};

PropertyHolder.prototype.setValue = function (newValue) {
    this.currentValue = newValue;
};

PropertyHolder.prototype.getValue = function () {
    return this.currentValue;
};

function Settings (settings) {
    for( var key in settings ) {
        this[key] = new PropertyHolder( settings[key] );
    }
};

Settings.prototype.reset = function () {
    for( var key in this ) {
        if( this[key] instanceof PropertyHolder ) {
            this[key].reset();
        }
    }
};

var settings = new Settings( {
    valueA: 42,
    valueB: ["Hello", "World"]
} );

console.log( settings.valueA.getValue() ); // 42
settings.valueA.setValue( -1 );
console.log( settings.valueA.getValue() ); // -1
settings.reset();
console.log( settings.valueA.getValue() ); // 42
正如大多数事情一样,这可以得到极大的改进。这只是为了让大家明白这个想法。不过,对于一个简单的小设置对象,我认为只保留默认值的第二个副本没有任何问题。它可能有点重复,但在这种情况下,它并没有那么糟糕

但是,这也可能有助于您避免重复:

var defaults = {
    'valueA': 42,
    'valueB': ["Hello", "World"]
};

var settings = {};

var getSetting = function (setting) {
    return typeof settings[setting] !== 'undefined' ? settings[setting] : defaults[setting];
};
var resetSettings = function () {
    settings = {};
};

console.log( getSetting( 'valueA' ) ); // 42
settings['valueA'] = -1;
console.log( getSetting( 'valueA' ) ); // -1
resetSettings();
console.log( getSetting( 'valueA' ) ); // 42

我不太喜欢使用字符串标识符,但大多数人似乎并不介意。

不要将
设置设置设置设置为be默认值
。而不是复制它们

// set up the defaults somewhere in your module
var defaults = {/* stuff */};

// then when initing and resetting, use `$.extend` or your clone flavor
// of choice to assign `s` a new copy of the defaults
s = $.extend({}, defaults);

这样
s.foo=“bar”
实际上不会更改
默认值
对象。

不要将
设置
设置为默认值
。而不是复制它们

// set up the defaults somewhere in your module
var defaults = {/* stuff */};

// then when initing and resetting, use `$.extend` or your clone flavor
// of choice to assign `s` a new copy of the defaults
s = $.extend({}, defaults);

这样一来,
s.foo=“bar”
实际上不会更改
默认值
对象。

为什么不将默认值保留为私有变量,然后在需要时将对象的克隆分配给设置?究竟是什么?有人编辑了我的代码,并对它进行了大规模的破坏。现在修好了,请再看一次。@shryas-这听起来是个不错的选择。你介意给我一个代码示例吗?为什么不保留默认值作为私有变量,然后在需要时将对象的克隆分配给设置?到底是什么?有人编辑了我的代码,并对它进行了大规模的破坏。现在修好了,请再看一次。@shryas-这听起来是个不错的选择。请给我一个代码示例好吗?肖恩,我想这就是我要找的。我意识到我遗漏了init代码,所以“s”变量不清楚它的用途。我更新了我的问题,所以现在更清楚了-你介意更新你的答案以匹配吗(如果必要的话?)我现在正在测试,如果需要,我会接受works@IvanDurst我更新了我的代码以匹配您的问题代码,并建议保护您的代码不与任何外部代码发生冲突Shawn,这太棒了,我让它工作了,非常感谢。我对您的代码做了一些编辑:“defaults”的右括号后的逗号必须是分号;在QuizApp对象之前添加了“var”(我不知道这是否必要)@IvanDurst除了QuizApp之外,我还有一个单独的变量作为默认值,这就是为什么没有分号,但是你所做的,正如你所说的,很好:)哦,我明白了。所以您不需要再次添加“var”,因为它们是一个逗号分隔的var列表。很有道理,谢谢你的澄清。肖恩,我想这就是我要找的。我意识到我遗漏了init代码,所以“s”变量不清楚它的用途。我更新了我的问题,所以现在更清楚了-你介意更新你的答案以匹配吗(如果必要的话?)我现在正在测试,如果需要,我会接受works@IvanDurst我更新了我的代码以匹配您的问题代码,并建议保护您的代码不与任何外部代码发生冲突Shawn,这太棒了,我让它工作了,非常感谢。我对您的代码做了一些编辑:“defaults”的右括号后的逗号必须是分号;在QuizApp对象之前添加了“var”(我不知道这是否必要)@IvanDurst我将默认值作为QuizApp之外的一个单独变量,这就是为什么没有分号的原因,但您所做的是,作为y