1.寫出 構(gòu)造函數(shù)模式、混合模式、模塊模式、工廠模式、單例模式、發(fā)布訂閱模式的范例。
工廠模式
<script>
// 缺點:無法知道實例是由哪個構(gòu)造函數(shù)創(chuàng)建的
function Person(name,age){
var message = {};
message.name = name;
message.age = age;
message.sayAge = function(){
console.log(this.age);
}
return message
}
var Person1 = Person('xiaoming',22);
Person1.name; //xiaoming
Person1.age; //22
Person1.sayAge(); //22
</script>
模塊模式
<script>
var Person = (function(){
var name = 'xiaoming',
age = 22;
function sayAge(){
console.log(name);
};
return {
name:name,
age:age,
sayAge:sayAge
}
})()
Person.name; //xiaoming
Person.age; //22
Person.sayAge(); //xiaoming
</script>
構(gòu)造函數(shù)模式
<script>
function Person(name,age){
this.name = name;
this.age = age;
};
Person.prototype.sayAge = function(){
console.log(this.age)
};
var person1 = new Person('xiaoming',22)
person1.sayAge(); //22
</script>
混合模式==繼承
<script>
function Person(name,age){
this.name = name;
this.age = age;
};
Person.prototype.sayAge = function(){
console.log(this.age);
};
function Student(name,age,score){
Person.call(this,name,age);
this.score = score
};
Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;
Student.prototype.sayScore = function(){
console.log(this.score);
};
var student1 = new Student('xiaoming',22,88);
student1.sayAge(); //22
student1.sayScore(); //88
</script>
單例模式
<script>
var Person = (function(){
var temp;
function init(name,age){
return {
name:name,
age:age,
sayName:function(){
console.log(this.name);
}
}
};
return {
createPerson:function(name,age){
if(!temp){
temp = init(name,age);
}
return temp;
}
}
}());
var person1 = Person.createPerson('xiaoming',22);
var person2 = Person.createPerson('xiaohong',10);
</script>

Paste_Image.png
發(fā)布訂閱模式
<script>
var EventCenter = (function(){
var events = {};
function on(evt,handler){
events[evt] = events[evt] || [];
events[evt].push({
handler:handler
})
};
function fire(evt,args){
if(!events[evt]){
return;
}
for(var i=0;i<events[evt].length;i++){
events[evt][i].handler(args);
}
};
function off(evt){
delete events[evt];
};
return {
on:on,
fire:fire,
off:off
}
}());
EventCenter.on('change',function(val){
console.log('change... now val is' + val);
});
EventCenter.on('change',function(val){
console.log('change2... now val is' + val);
});
EventCenter.fire('change','jirengu');
//打印結(jié)果 change... now val isjirengu
//change2... now val isjirengu
EventCenter.off('change');
</script>
2.使用發(fā)布訂閱模式寫一個事件管理器,可以實現(xiàn)如下方式調(diào)用
Event.on('change', function(val){
console.log('change... now val is ' + val);
});
Event.fire('change', '杭州');
Event.off('changer');
<script>
var EventCenter = (function(){
var events = {};
function on(evt,handler){
events[evt] = events[evt] || [];
events[evt].push({
handler:handler
})
};
function fire(evt,args){
if(!events[evt]){
return;
}
for(var i=0;i<events[evt].length;i++){
events[evt][i].handler(args);
}
};
function off(evt){
delete events[evt];
};
return {
on:on,
fire:fire,
off:off
}
}());
EventCenter.on('change',function(val){
console.log('change... now val is ' + val);
});
EventCenter.on('change',function(val){
console.log('change2... now val is ' + val);
});
EventCenter.fire('change','杭州');
//打印結(jié)果 change... now val is 杭州
//change2... now val is 杭州
EventCenter.off('change');
</script>