JAvascript設計モード漫談【0】インタフェースクラスの製造


最近を見ていると、純english版はちょっと苦労しているように見えますが、無理に少し知識を吸収しました.あまり心が狭いわけにはいかないと精神的に教えてくれたので、少しずつ分かち合いましょう.一方、私は最近ずっとブログを書いていないことを補っています.
 
私の計画は、このjavascript設計モードを一歩一歩汲み取って共有することです.では、私たちの最初の駅はjavascriptのインタフェースから話します.
私たちのサービス側コードはJava言語で例を挙げています.ちょうど、この言語はjavascript言語と歴史的なつながりがあります.通常java言語のインタフェース定義は次のようになります.
public interface MyInterface{
   String A();
   void B();
   int C();
}

//implements the interface MyInterface

public class MyClass implements MyInterface{
   public String A(){...}
   public void B(){....}
   public int C(){....}
}

 
では、私たちのjavascriptの間にはどのようにインタフェースを書きますか?実はjavascriptにはもともとインタフェースの概念がありません.しかし、私たちはこのような「死」の考えを持ってはいけません.私たちの頭は柔軟で、javascript言語も柔軟です.当初、私たちがc++を学んだときもインタフェースがあるとは聞いていませんでしたね.では、インタフェースは何ですか.
オブジェクト向け言語では、オブジェクトをカプセル化するには、プロパティとカプセル化方法が必要です.これらの方法は、多くの類似オブジェクト特有の方法を表すことが多い.だからインタフェースを派生します.実は簡単です:インタフェースは共通の方法の定義です.
実はメソッド本省は属性がなく、メソッドのみのオブジェクトに似ています.javascriptインタフェースを構築するには、この点から出発します.インタフェースオブジェクトを作成し、インタフェースメソッドを定義する必要があります.最後に、これらのインタフェースをインスタンスオブジェクトで実装します.
 
1.Interfaceオブジェクトの定義:var Interface=function(){....}
2.インタフェースメソッドの定義(メソッド名のみ、メソッドボディはどのように実装されていませんか?)では、これらのインタフェースメソッド名を保存するために、InterfaceでMethods配列を定義します.var Interface=function(name,methods){
                                         this.name = name;
                                         this.methods  =[];
                                          .......
                                           }
3.インスタンスオブジェクトを探してインタフェースを実装します.javascriptでは実際の実装インタフェースは不可能です.そうするしかありません.インタフェースという標準的な方法シリーズを規定しています.あなたのすべての形態意識的に彼のインタフェースクラスを実現するには、彼のメソッド名を実現しなければなりません.つまり、メソッド名はインタフェースと一致しなければなりません.では、このような仕事を厳しくするには、私たちには最後のことがあります.
4.インタフェースメソッドの実装検証.すなわち,オブジェクトのメソッド名がインタフェース内のメソッド名をすべて実装しているかどうかを検証する.ここではInterfaceにensureImplementsメソッドを与え,検証を行う.
 
では、コードを写し始めます.
 
//Constructor.

var Interface = function(name,methods){
	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("               “);
		}
		this.methods.push(methods[i]);
	}
};

//Static class Method

Interface.ensureImplements = function(object){
	if(arguments.length<2){
		throw new Error("   Interface.ensureImplemnents    " + arguments.length+ "   ,      2  .");
	}
	for(var i=1,len = arguments.length; i<len; i++){
		var _interface = arguments[i];
		if(_interface.constructor !== Interface){
			throw new Error("   Interface.ensureImplements                ");
		}
		
		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 implements the "+_interface.name + "interface. Method "+ method + " was not found");
			}
		}
	}
};

これで、インタフェースクラスが作成され、インタフェースを定義する方法は次のとおりです.
var myInterface = new Interface('myInterface',['methodA','methodB','methodC']);

//   myInterface      ,methodA~methodC        

 
Next~~インタフェースを実装します~~
 
/**
 * design interface
 */

var MyInterface = new Interface('MyInterface',['A','B','C']);

/**
 * implements the methods of the interface
 */

var MyObject = function(name){
	this.name = name;
}
MyObject.prototype.A = function(){
	alert('A');
}
MyObject.prototype.B = function(){
	alert('B');
}
MyObject.prototype.C = function(){
	alert('C');
}
MyObject.prototype.D = function(){
	alert('another method D');
}

window.onload = function(){
	var myObj = new MyObject('jgx');
	Interface.ensureImplements(myObj,MyInterface);
	myObj.D();
}

 
 
これらをホームページに入れてみてください
 
<html>
<head>
    <title>test</title>
   <script type="text/javascript" src="Interface.js"></script>
   <script type="text/javascript" src="implements.js"></script>
</head>
<body></body>
</html>

 
 
OK~~~そろそろ休みます~~
 
終了:
きっとまた戻ってくるよ~~