您的位置:首页 > Web前端 > JavaScript

学习JavaScript设计模式(五)

2017-03-20 21:39 495 查看

Mixin(混入)模式

代码复用:最常见的方式时继承,但是继承会让子类获得父类的所有属性和方法。即使子类只使用到很少的一部分属性或方法。

Mixin 模式就是解决这一问题:实现部分继承(从父类继承所需要的一部分属性或方法)和多重继承。

Mixin 模式实际上就是一种属性的复制。例如我们常用的 JQuery 中的 extend 方法就是实现这一模式。

简单代码实现:

/**
* Created by Zang on 2017/3/20.
*/

var Car = function (setting) {
this.model = setting.model || 'no model';
this.color = setting.color || 'no color';
};

function augment(recive, source) {
if (arguments[2]) {
for (var i = 2; i < arguments.length; i++) {
recive.prototype[arguments[i]] = source.prototype[arguments[i]];
}
}
else {
for (var key in source.prototype) {
if (!recive.prototype[key]) {
recive.prototype[key] = source.prototype[key];
}
}
}
}

var Mixin = function () {
};
Mixin.prototype = {
sayHello: function () {
console.log('hello');
},
sayHi: function () {
console.log('hi');
}
};

// 增加特定的方法
augment(Car, Mixin, 'sayHello');

var car1 = new Car({
model: 'car1',
color: 'blue'
});
car1.sayHello();    // hello
// car1.sayHi();       // car1.sayHi is not a function

// 增加所有的方法
augment(Car, Mixin);

var car2 = new Car({
model: 'car2',
color: 'blue'
});
car2.sayHello();    // hello
car2.sayHi();       // hi


优点:有助于减少系统中的重复功能及增加函数复用。

缺点:有些开发人员认为将功能注入到对象原型中是一种很糟糕的想法,因为他会导致原型污染和函数起源方面的不确定性。

Decorator(装饰者)模式

Decorator 模式并不是严格依赖创建对象的方式,而是关注扩展其额外功能。

基本思想:向基本对象添加(装饰)属性或方法,而不是进行子类化,因此它较为精简。

简单代码实现:

/**
* Created by Zang on 2017/3/20.
*/

function MacBook() {
this.size = 13;
this.ram = 4;
}

function Ram(macbook, num) {
macbook.ram += num;
}

function Size(macbook, num) {
macbook.size += num;
}

// 17英寸4GB内存
var macbook1 = new MacBook();
Size(macbook1, 4);
// MacBook {size: 17, ram: 4}
console.log(macbook1);

// 15英寸16GB内存
var macbook2 = new MacBook();
Size(macbook2, 2);
Ram(macbook2, 12);
// MacBook {size: 15, ram: 16}
console.log(macbook2);


优点:开发人员喜欢使用它,因为它使用时可以时透明的,并且也是相当灵活。

缺点:如果管理不当,它会极大的复杂化引用程序架构。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript 设计模式