我正在创建一个测验交互,经过几天的研究,我试图确定声明对象的最佳方法。有一个主要的匿名函数(可以称为测验,但不需要公共方法),其中包含场景的类定义,其中包含问题的类定义:
测验>方案>问题>答案(最终)
我更喜欢立即调用('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 */);