我正在创建一个测验交互,经过几天的研究,我试图确定声明对象的最佳方法。有一个主要的匿名函数(可以称为测验,但不需要公共方法),其中包含场景的类定义,其中包含问题的类定义:

测验>方案>问题>答案(最终)

我更喜欢立即调用('iffy')模型来执行私有/公共模型,但是我还需要多个实例,所以我相信我应该使用原型吗?我将类定义放置为私有,因为它们仅被此交互使用。这是最好的模型吗?

JsFiddle:http://jsfiddle.net/QtCm8/

(function(quizData) {
    var scenarios = [];
    for(var s=0;s<quizData.scenarios.length;s++) scenarios.push(new Scenario(quizData.scenarios[s]));
    function Scenario(scenarioData) {
        console.log("New Scenario: " + scenarioData.title);
        var questions = [];
        for(var q=0;q<scenarioData.questions.length;q++) questions.push(new Question(scenarioData.questions[q]));
        function Question(questionData) {
            console.log("New Question: " + questionData.text);
            // Repeat pattern for future answers object
        }
    }
})({
    scenarios: [
        {
            title: 'Scenario1'
            ,questions: [
                {
                    text: 'What is 1+1?'
                }
                ,{
                    text: 'What is 2+2?'
                }
            ]
        }
    ]
});

最佳答案

考虑将类打包到对象中。以下是我想到的一种设计模式。由于您有很多相互依赖的类,所以我认为最好将它们排列成一个对象。这是代码:

var quiz = {};

quiz.init = (function(data) {
    this.scenarios = this.questions = this.answers = [];

    this.data = {
        Question: data.Question.bind(this),
        Answer: data.Answer.bind(this),
        Scenario: data.Scenario.bind(this)
    };

    this.set_data = function(qas) {
        // fill the arrays here
        // Question, Scenario and Answer are now this.data.Question/Answer...
        // you can use a variable to shorten the names here
    };
});

var Quiz = function(data) {
    return new quiz.init(data);
};

var data = { // classes are defined here
    Question: function() {},
    Answer: function() {},
    Scenario: function() {}
};

var q = Quiz( data );

q.data.set_data(/* Big object literal goes here */);

10-05 21:18