1.委托理论
委托行为意味着某些对象在找不到属性或方法引用时会把这个请求委托给另外一个对象。
这是一种极其强大的设计模式,和父类,子类,继承,多态等概念完全不同,这种模式不是由父类到子类的垂直关系所组织的,而是由可以向任意方向委托并联组织的
Task = {
setID: function(ID) {this.id = ID;},
outputID: function() {console.log( this.id); }
};
XYZ = Object.create(Task);
XYZ.prepareTask = function(ID,Label) {
this.setID( ID );
this.label = Label;
};
XYZ.outputTaskDetails = function() {
this.outputID();
console.log(this.label);
};
XYZ通过Object.create()创建,它的[[prototype]]委托了Task对象
显而易见的是,委托是不能互相委托,互相委托会无限循环
比较面向对象风格和对象关联风格代码的不同
面向对象
function Foo(who) {
this.me = who;
}
Foo.prototype.identify = function() {
return "I am " + this.me;
};
function Bar(who) {
Foo.call(this,who); //call的调用形式 call(this,arguments) who会传到Foo进行赋值
}
Bar.prototype = Object.create(Foo.prototype); //创建Bar.prototype关联到Foo.prototype
Bar.prototype.speak = function() {
alert("Hello, " + this.identify() + "." );
};
var b1 = new Bar( "b1" );
var b2 = new Bar( "b2" );
//生成两个实例
b1.speak();
b2.speak();
子类Bar继承了父类Foo,然后生成了b1,b2两个实例。b1委托了Bar.prototype,Bar.prototype委托了Foo.prototype
对象关联风格
Foo = {
init: function(who) {
this.me = who;
},
identify: function() {
return "I am " + this.me;
}
};
Bar = Object.create( Foo );
Bar.speak = function() {
alert( "Hello, " + this.identify() + "." );
};
var b1 = Object.create( Bar );
b1.init( "b1" );
var b2 = Object.create( Bar );
b2.init( "b2" );
b1.speak();
b2.speak();
这段代码没有采用关联原型的做法,也没有构造函数和new,避免了一些复杂的操作.
小结
在软件架构中你可以选择使用类还是进行委托,它们都是非常强大的设计模式。
行为委托是兄弟关系,而类是父子关系。合理的使用能够提高代码的质量,使结构更加清晰,语法更加简单