1. 寫出 構造函數(shù)模式射窒、混合模式、模塊模式芽丹、工廠模式北启、單例模式、發(fā)布訂閱模式的范例志衍。
<script>
function Car(name, year, country){
this.name = name;
this.year = year;
this.country = country;
}
Car.prototype.sayName = function(){
return this.name;
}
var mycar = new Car("BMW", 2017, "Germany");
console.log(mycar);
</script>
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.sayName = function(){
console.log(this.name)
}
function Student(name, age, score){
Person.call(this, name, age);
this.score = score;
}
Student.prototype = Object.create(Person.prototype);
Student.prototype.sayScore = function() {
console.log(this.score);
}
var supo = new Student("supo", 20, 80)
supo.sayName();
supo.sayScore();
/*
模塊模式
- JS的模塊通過作用域體現(xiàn)
- 一個模塊代表一個作用域
- 詞法作用域:
- 一個Fn能訪問的上下文空間
- 有它所定義的位置決定
- 可通過閉包實現(xiàn)
- 不會污染全局
*/
var Person = (function() {
var name = 'xxx'
function sayName() {
console.log(name)
}
return{
name: name,
sayName: sayName
}
})()
<script>
function Car(name, year, country){
var obj = new Object();
obj.name = name;
obj.year = year;
obj.country = country;
obj.sayName = function(){
console.log(this.name);
}
return obj
}
var mycar = Car("BMW", 2017, "Germany");
var yourcar = Car("Benz", 2016, "Germany");
</script>
var Car = (function(){
var car;
function init(name, year, country) {
return {
name: name,
year: year,
country: country
}
}
return {
createCar: function(name, year, country){
if(!car){
car = init(name, year, country);
}
return car;
}
}
}());
var car1 = Car.createCar("BMW", 2017, "Germany");
var car2 = Car.createCar("Benz", 2016, "Germany");
var EventCenter = (function(){
var events = {};
function on(event, handler){
events[event] = events[event] || [];
events[event].push({
handler: handler
});
}
function fire(event, args){
if (!events[event]) {return}
for (var i = 0; i < events[event].length; i++) {
events[event][i].handler(args);
}
}
function off(event){
delete events[event];
}
return {
on: on,
fire: fire,
off: off
}
})();
EventCenter.on('event', function(data){
console.log('event received...');
});
EventCenter.on('event', function(data){
console.log('event2 received...');
});
EventCenter.fire('event');
EventCenter.off('event');
EventCenter.fire('event');
2. 使用發(fā)布訂閱模式寫一個事件管理器暖庄,可以實現(xiàn)如下方式調(diào)用
Event.on('change', function(val){
console.log('change... now val is ' + val);
});
Event.fire('change', '饑人谷');
Event.off('change');
var Event = (function(){
var events = {};
function on(event, handler){
events[event] = events[event] || [];
events[event].push({
handler: handler
})
};
function fire(event, args){
if (!events[event]) {
return
}
for (var i = 0; i < events[event].length; i++) {
events[event][i].handler(args)
}
}
function off(event){
delete events[event]
}
return {
on: on,
off: off,
fire: fire
}
})()
Event.on('change', function(val){
console.log('change... now val is ' + val);
});
Event.fire('change', '饑人谷');
Event.off('change');
Event.fire('change', '饑人谷');