interface FormItem {
function save();
}
*/
var CompositeForm = function(id, メソッド, アクション) {
this.implementsInterfaces = ['Composite', 'FormItem'] ;
...
};
...
function addForm(formInstance) {
if(!implements(formInstance, 'Composite', 'FormItem')) {
throw new Error("オブジェクトは必要なインターフェイスを実装していません。");
}
...
}
// オブジェクトが // 必要なインターフェイスを実装します。
functionimplements(object) {
for(var i = 1; i < argument.length; i ) {
// すべての引数をループします
/ / 最初のものの後。 if(object.implementsInterfaces[j] == インターフェース名) {
InterfaceFound = true;
Break;
}
if(!interfaceFound) {
return false;
}
}
return true; 最初のメソッドの改良点として、インターフェイスの定義は引き続きアノテーションの形式で実装されますが、 type は特定のインターフェイスを実装します。
3. ダックタイピングによるインターフェイスのエミュレーション
コードをコピー
コードは次のとおりです:
// インターフェース。
var Composite = new Interface('Composite', ['add', 'remove', 'getChild']);
var FormItem = new Interface('FormItem', ['save']);
// CompositeForm クラス
var CompositeForm = function(id, method, action) {
...
};
...
function addForm(formInstance) {
ensureImplements(formInstance, Composite, FormItem);
// 必要なメソッドが実装されていない場合、この関数はエラーをスローします。
...
}
// コンストラクター。
var Interface = function(name,methods) {
if(arguments.length != 2) {
throw new Error("インターフェイス コンストラクターが "
arguments.length " 引数で呼び出されていますが、期待されています正確に 2.");
}
this.name = 名前;
this.methods = [];
for(var i = 0, len =methods.length; i
if(typeofmethods[i] !== 'string') {
throw new Error("インターフェイス コンストラクターは、メソッド名が文字列として渡される "
" であることを期待します。");
}
this.methods.push(methods[i]);
}
};
// 静的クラスメソッド。
Interface.ensureImplements = function(object) {
if(arguments.length < 2) {
throw new Error("Function Interface.ensureImplements が "
arguments.length " 引数で呼び出されますが、少なくとも 2 が予想されます。");
}
for(var i = 1, len = argument.length; i < len; i ) {
varinterface = argument[i];
if(interface.constructor !== Interface) {
throw new Error("Function Interface.ensureImplements Expects argument"
"2つ以上はInterfaceのインスタンスになります。");
}
for(var j = 0,methodsLen =interface.methods.length; j varmethods=interface.methods[j];
if(!object[method] || typeof object[method] !== 'function') {
throw new Error("Function Interface.ensureImplements: object "
" は " インターフェイスを実装していません.name " インターフェイス。メソッド " メソッド " が見つかりませんでした。");
}
}
}
};
いつインターフェイスを使用しますか?インターフェイスの使用は、JavaScript のアクティブ性を制限する一方で、より複雑なシステムの設計を開始するときに、より効果的です。 は、共有コードをより活発にし、あらゆる種類の変更を送信でき、望ましい方法を保護します。インターフェースは、実装されていない API を頻繁に使用するか、他のプログラムに提供される独自のメソッドを使用する必要があるため、この場合、インターフェースは相当の価値があります。実装されている API が変更されたとき、公開プロセス中に API が変更された場合、そのインターフェイスを別の方法で実装できることをすぐに知ることができます。
インターフェイスをどのように使用しますか?
最初に問題となるのは、転送されるコードにインターフェイスの使用が適しているかどうかです。インターフェイスを使用する場合は、次のようなプロトコルの作成:
1. インターフェイスのソース ファイルを参照してください。インターフェイスのソース ファイルは、次のようにして次のステーション ポイントに到達できます: http://jsdesignpatterns.com /。
2. 転送されたコードを検査し、これらのメソッドがインターフェイス セクションに抽象化される必要があることを確認します。念のため、私たちは、第 3 のインターフェイス実装方式、つまり、代わりのインターフェイスを使用します。