코드는 다음과 같습니다
functionquestionCreator(spec, my) {
var that = {};
내 = 내 || {};
my.label = spec.label;
my.renderInput = function() {
throw "구현되지 않음";
};
that.render = function(target) {
var QuestionWrapper = document.createElement('div');
questionWrapper.className = '질문';
varquestionLabel = document.createElement('div');
questionLabel.className = '질문 라벨';
var label = document.createTextNode(spec.label);
questionLabel.appendChild(레이블);
var 답변 = my.renderInput();
questionWrapper.appendChild(questionLabel);
questionWrapper.appendChild(답변);
질문 반환Wrapper;
};
반품하세요.
}
function choiceQuestionCreator(spec) {
var my = {},
that =questionCreator(spec, my);
my.renderInput = function() {
var input = document.createElement('select');
var len = spec.choices.length;
for (var i = 0; i < len; i ) {
var option = document.createElement('option');
option.text = spec.choices[i];
option.value = spec.choices[i];
input.appendChild(옵션);
}
입력을 반환합니다.
};
반품하세요.
}
function inputQuestionCreator(spec) {
var my = {},
that =questionCreator(spec, my);
my.renderInput = function() {
var input = document.createElement('input');
input.type = '텍스트';
입력을 반환합니다.
};
반품하세요.
}
var view = {
render: function(target, questions) {
for (var i = 0; i < questions.length; i ) {
target.appendChild( 질문[i].render());
}
}
};
var questions = [
choiceQuestionCreator({
label: '지난 30일 이내에 담배 제품을 사용한 적이 있습니까?',
choices: ['Yes', 'No']
} ),
inputQuestionCreator({
label: '현재 사용하고 있는 약은 무엇입니까?'
})
];
varquestionRegion = document.getElementById('questions');
view.render(questionRegion, 질문);
상위 표면의 대리석은 了一些技术点,我们来逐一看一下:
首先,questionCreator방식으로 创建,可以让我们使用模板方法模式将处理问题的功能delegat给针对每个问题类型的扩大码renderInput上.
其次,我们次,我们换掉了前私属性替换掉了前私属性,因为我们封装了렌더 行为进行操作 不再需要把这些属性暴露给
第三,我们为每个问题类型创建一个对象进行各自的代码实现, 但每个实现里島必须包含renderInput방법便覆盖questionCreator방식으로 renderInput代码,这就是我们常说的.参数(之前的版本是一个可选参数)。
总结
중요한 전망이 매우 좋습니다.类型就行了,view对象本身不再修改任何改变,从而达到了开闭原则的要求。
另:懂C#的话,不知道看了上面的代码后是否多态的实现有些类似?其实上述的代码用原型也是可以实现的,大家可以自行研究一下。