本文介绍: 在软件架构中你可以选择是否使用类和继承设计模式。大多数开发者理所当然地认为类是唯一(合适)的代码组织方式,但是本章中我们看到了另一种更少见但是更强大的设计模式行为委托行为委托认为对象之间是兄弟关系,互相委托,而不是父类和子类的关系。JavaScript 的[[Prototype]] 机制本质就是行为委托机制。也就是说,我们可以选择在 JavaScript 中努力实现机制,也可以拥抱更自然的 [[Prototype]] 委托机制

回顾一下原型发现[[Prototype]]机制就是指对象中的一个内部链接引用一个对象这个机制本质就是对象之间关联关系

1、面相委托的设计

Task = {
	setID: function(ID) { this.id = ID; },
	outputID: function() { console.log( this.id ); }
};
// 让 XYZ 委托 Task
XYZ = Object.create( Task );
XYZ.prepareTask = function(ID,Label) {
	this.setID( ID );
	this.label = Label;
};
XYZ.outputTaskDetails = function() {
	this.outputID();
	console.log( this.label );
};
// ABC = Object.create( Task );
// ABC ... = ...

我们把这种编码风格称为对象关联”,在JS中[[Prototype]]机制会把对象关联到其他对象对象关联的代码会有一些不同之处:

  1. 在上面的代码中,idlabel 数据成员都是直接存储在 XYZ 上(而不是 Task)。通常来说,在 [[Prototype]] 委托中最好把状态保存在委托者(XYZ、ABC)而不是委托目标(Task)上。

  2. 在类设计模式中,我们故意让父类(Task和子类(XYZ)中都有 outputTask 方法,这
    样就可以利用重写多态)的优势。在委托行为中则恰好相反:我们会尽量避免在[[Prototype]] 链的不同级别使用相同命名,否则就需要使用笨拙并且脆弱的语法消除引用歧义(参见第 4 章)。
    这个设计模式要求尽量少使用容易被重写的通用方法名,提倡使用更有描述性方法名,尤其是要写清相应对象行为类型。这样做实际上可以创建出更容易理解维护代码,因为方法名(不仅在定义位置,而是贯穿整个代码)更加清晰(自文档)。

  3. this.setID(ID);XYZ 中的方法首先会寻找 XYZ 自身是否有 setID(…),但是 XYZ 中并没有这个方法名,因此会通过 [[Prototype]] 委托关联到 Task 继续寻找,这时就可以找到setID(…) 方法。此外,由于调用位置触发this 的隐式绑定规则(参见第 2 章),因此虽然 setID(…) 方法在 Task 中,运行this 仍然会绑定到 XYZ,这正是我们想要的。在之后的代码我们还会看到 this.outputID(),原理相同。

    换句话说,我们和 XYZ 进行交互可以使用 Task 中的通用方法,因为 XYZ 委托了 Task。

委托行为意味着某些对象(XYZ)在找不到属性或者方法引用时会把这个请求委托给另一个对象(Task)。这是一种极其强大的设计模式,和父类子类继承多态概念完全不同

2、总结

软件架构中你可以选择是否使用类和继承设计模式。大多数开发者理所当然地认为类是唯一(合适)的代码组织方式,但是本章中我们看到了另一种更少见但是更强大的设计模式行为委托。

行为委托认为对象之间是兄弟关系,互相委托,而不是父类和子类的关系。JavaScript 的[[Prototype]] 机制本质上就是行为委托机制。也就是说,我们可以选择在 JavaScript 中努力实现类机制,也可以拥抱更自然的 [[Prototype]] 委托机制。

当你只用对象来设计代码时,不仅可以让语法更加简洁,而且可以让代码结构更加清晰。

对象关联(对象之前互相关联)是一种编码风格,它倡导的是直接创建和关联对象,不把它们抽象成类。对象关联可以用基于 [[Prototype]] 的行为委托非常自然地实现

原文地址:https://blog.csdn.net/qq_60754128/article/details/134723263

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_39974.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注