javascript设计模式 接口介绍_javascript技巧_脚本之家

javascript设计模式 接口介绍_javascript技巧_脚本之家。这本书中第一个重要的内容就是接口。大家对接口应该都不陌生,简单的说接口就是一个契约或者规范。在强类型的面相对象语言中,接口可以很容易的实现。但是在javascript中并没有原生的创建或者实现接口的方式,或者判定一个类型是否实现了某个接口,我们只能利用js的灵活性的特点,模拟接口。
在javascript中实现接口有三种方式:注释描述、属性验证、鸭子模型。
note:因为我看的是英文书,翻译水平有限,不知道有些词汇如何翻译,大家只能领会精神了。

在实际中,我们可以在注释中定义好接口,在实际的代码中予以实现 比如:
复制代码 代码如下: /* interface
Composite { function add; function remove; function getChild; }
interface FormItem { function save(); } */ var CompositeForm = function
{ // implements Composite, FormItem … }; // Implement the Composite
interface. CompositeForm.prototype.add = function { … };
CompositeForm.prototype.remove = function { … };
CompositeForm.prototype.getChild = function { … }; // Implement the
FormItem interface. CompositeForm.prototype.save = function() { … };
实现接口的程序员是否将这些接口都实现了呢?我们没办法保证!因为这里没有任何办法去检查是否都实现了
我们需要一个检查是否实现了接口的机制,可以这样: 复制代码 代码如下: /* interface Composite {
function add; function remove; function getChild; } interface FormItem {
function save(); } */ var CompositeForm = function {
this.implementsInterfaces = [‘Composite’, ‘FormItem’]javascript设计模式 接口介绍_javascript技巧_脚本之家。; … }; …
function addForm { if(!implements(formInstance, ‘Composite’,
‘FormItem’)) { throw new Error(“Object does not implement a required
interface.”); } … } // The implements function, which checks to see if
an object declares that it // implements the required interfaces.
function implements { for(var i = 1; i < arguments.length; i++) { //
Looping through all arguments // after the first one. var interfaceName
= arguments[i]; var interfaceFound = false; for(var j = 0; j <
object.implementsInterfaces.length; j++) {
if(object.implementsInterfaces[j] == interfaceName) { interfaceFound =
true; break; } } if { return false; // An interface was not found. } }
return true; // All interfaces were found. }
这种方法让程序员在写的时候注明实现了哪些接口: this.implementsInterfaces
= [‘Composite’, ‘FormItem’];
在调用的时候使用implements方法来判断是否实现了,理论上可行,很有可能写上了实现了’Composite’接口,但是代码里却并没有add方法!因此,我们需要检验实现接口的类是否包含了接口里的方法!所以,接口必须从注释中解放出来:
复制代码 代码如下: // Interfaces. var
Composite = new Interface(‘Composite’, [‘add’, ‘remove’, ‘getChild’]);
var FormItem = new Interface; // CompositeForm class var CompositeForm =
function { // implements Composite, FormItem … }; … function addForm
{ Interface.ensureImplements(formInstance, Composite, FormItem); // This
function will throw an error if a required method is not implemented, //
halting execution of the function. // All code beneath this line will be
executed only if the checks pass. … }
定义接口Composite,FormItem,并且CompositeForm实现这两个接口,在使用的时候,用Interface.ensureImplements来检验formInstance是否实现了这两个接口中的所有方法。
来看看Interface的定义:两个参数,第一个参数是接口名称,第二个参数是接口包含的方法数组
复制代码 代码如下: // Constructor. var
Interface = function { if(arguments.length != 2) { throw new
Error(“Interface constructor called with ” + arguments.length +
“arguments, but expected exactly 2.”); } this.name = name; this.methods
= []; for(var i = 0, len = methods.length; i < len; i++) {
if(typeof methods[i] !== ‘string’) { throw new Error(“Interface
constructor expects method names to be ” + “passed in as a string.”); }
this.methods.push; } }; 为Interface 添加建议接口是否实现的静态方法 复制代码 代码如下: // Constructor.
Interface.ensureImplements = function { if { throw new Error(“Function
Interface.ensureImplements called with ” + arguments.length +
“arguments, but expected at least 2.”); } for(var i = 1, len =
arguments.length; i < len; i++) { var interface = arguments[i];
if(interface.constructor !== Interface) { throw new Error(“Function
Interface.ensureImplements expects arguments” + “two and above to be
instances of Interface.”); } for(var j = 0, methodsLen =
interface.methods.length; j < methodsLen; j++) { var method =
interface.methods[j]; if(!object[method] || typeof object[method]
!== ‘function’) { throw new Error(“Function Interface.ensureImplements:
object ” + “does not implement the ” + interface.name + ” interface.
Method ” + method + ” was not found.”); } } } };

发表评论

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