行为委托

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,避免了一些复杂的操作.

 

小结

在软件架构中你可以选择使用类还是进行委托,它们都是非常强大的设计模式。

行为委托是兄弟关系,而类是父子关系。合理的使用能够提高代码的质量,使结构更加清晰,语法更加简单

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值