JavaScript_10設計模式(建立介面的方式【三】)鴨式辯型法
阿新 • • 發佈:2018-11-20
<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>New Web Project</title> <script type="text/javascript" charset="UTF-8"> /** * 實現介面的第三種方法: * 鴨式辯型實現(是最完美的JavaScript實現介面方式)。 * 註解描述法、屬性檢測法 * * 鴨式辯型實現核心: * 1.目的,一個類實現介面的主要目的:把接口裡的方法都實現了。 * 2.完全面向物件,程式碼統一。 * * */ //一、介面類 Class Interface==>例項化N多個介面。 /*** * 介面類需要幾個引數?(2個) * 引數1:介面名 * 引數2:methods 接收方法名稱的陣列(集合)。 * */ var Interface=function(name,methods){ //判斷介面引數的個數: if(arguments.length!=2){ throw new Error("this instance constructor arguments must be 2 length"); } this.name=name; this.methods=[];//定義一個內建的空陣列物件,等待接收 methods裡面的元素。(方法名字) for(var i=0,len=methods.length;i<len;i++){ if(typeof methods[i]!=='string'){ throw new Error("the Interface method name is error"); } this.methods.push(methods[i]); } } //二、準備工作:具體的實現類 //1.例項化介面物件 var CompositeInterface=new Interface('CompositeInterface',['add','remove']); var FormItemInterface=new Interface('FormItemInterface',['update','select']); //2.CompositeImp interface 具體的實類現 var CompositeImpl =function(){ } //3.implents method 實現介面的方法 CompositeImpl.prototype.add=function(obj){ alert('add'); } CompositeImpl.prototype.remove=function(obj){ alert('remove'); } CompositeImpl.prototype.update=function(obj){ alert('update'); } CompositeImpl.prototype.select=function(obj){ alert('select'); } //三 、檢驗接口裡的方法 //如果檢驗通過,不做任何操作。如果不通過,瀏覽器丟擲異常(error)。 //這個方法的目的就是檢測方法的。 Interface.ensureImplements=function(object){ //如果檢測方法,接收的引數小於2個,引數傳遞失敗。 if(arguments.length<2){ throw new Error('Interface.ensureImplements method constructor arguments must be>=2!'); } //獲得介面實列物件 for(var i=1,len=arguments.length;i<len;i++){ var instanceInterface=arguments[i]; //判斷引數是否是介面類的型別。 if(instanceInterface.constructor!==Interface){ throw new Error('the arguments constructor not be Interface Class'); } //迴圈介面實列物件裡面的每一個方法。 for(var j=0;j<instanceInterface.methods.length;j++){ //用一個臨時變數,接收每一個方法的名字。(注意是字串,並不是函式。) var methodName=instanceInterface.methods[j]; //object(key)就是方法 if(!object[methodName]||typeof object[methodName]!=='function'){ throw new Error('the method is not found!'); } } } } var c1=new CompositeImpl(); Interface.ensureImplements(c1,CompositeInterface,FormItemInterface); c1.add(); </script> </head> <body> <h1>New Web Project Page</h1> </body>