>웹 프론트엔드 >JS 튜토리얼 >JavaScript 디자인 패턴 인터페이스 소개_javascript 기술

JavaScript 디자인 패턴 인터페이스 소개_javascript 기술

WBOY
WBOY원래의
2016-05-16 17:51:481189검색

이 책에서 가장 먼저 중요한 내용은 인터페이스입니다.

모든 사람은 인터페이스에 대해 잘 알고 있어야 합니다. 간단히 말해서 인터페이스는 계약 또는 사양입니다. 강력한 형식의 객체 지향 언어에서는 인터페이스를 쉽게 구현할 수 있습니다. 그러나 JavaScript에서 인터페이스를 생성 또는 구현하거나 유형이 특정 인터페이스를 구현하는지 확인하는 기본 방법은 없습니다. 인터페이스를 시뮬레이션하기 위해 js의 유연성만 사용할 수 있습니다.
JavaScript에서 인터페이스를 구현하는 방법에는 주석 설명, 속성 확인, 덕 모델의 세 가지 방법이 있습니다.
참고: 영어 책을 읽고 있는데 번역 능력이 제한되어 있기 때문에 일부 단어를 번역하는 방법을 모르겠습니다. 정신만 이해할 수 있습니다.
1. 주석으로 인터페이스 설명
예:

코드 복사 코드는 다음과 같습니다.

/*
인터페이스 복합 {
함수 add(child)
function delete(child)
function getChild(index);
 function save();
}
*/
var CompositeForm = function(id, method, action) { // Composite, FormItem 구현
 ...
}; 🎜>//Composite 인터페이스를 구현합니다.
CompositeForm.prototype.add = function(child) {
...
}
CompositeForm.prototype.remove = function(child) {
...
};
CompositeForm.prototype.getChild = function(index) {
...
};
// FormItem 인터페이스를 구현합니다. .save = function() {
...
};


다른 객체지향 언어를 시뮬레이션하고 인터페이스를 사용하고 키워드를 구현하지만 주석을 달아야 하므로 거기에 문법 오류가 없을 것입니다.
이 글의 목적은 다른 프로그래머들에게 이러한 클래스가 구현해야 할 메소드와 프로그래밍 시 주의해야 할 메소드가 무엇인지 알려주는 것입니다. 그러나 이러한 클래스가 해당 인터페이스의 메서드를 올바르게 구현하는지 확인하는 확인 방법은 제공되지 않습니다.
2. 속성 검사로 인터페이스 에뮬레이션
예:




코드 복사
코드는 다음과 같습니다. /* 인터페이스 복합 {
function add(child);
function delete(child)
function getChild(index); {
function save();
}
*/
var CompositeForm = function(id, method, action) {
this.implementsInterfaces = ['Composite', 'FormItem'] ;
...
}
...
function addForm(formInstance) {
if(!implements(formInstance, 'Composite', 'FormItem')) {
throw new Error("객체는 필수 인터페이스를 구현하지 않습니다.")
 }
 ...
}
// 객체가 // 필요한 인터페이스를 구현합니다.
function Implements(object) {
for(var i = 1; i < 인수.길이; i ) {
// 모든 인수를 통해 반복
/ / 첫 번째 이후.
 var 인터페이스 이름 = 인수[i];
 var 인터페이스Found = false
 for(var j = 0; j < object.implementsInterfaces.length; j ) {
if(object.implementsInterfaces[j] == 인터페이스이름) {
인터페이스Found = 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 인터페이스 = 함수(이름, 메서드) {
  if(arguments.length != 2) {
    throw new Error("
              인수.길이 "argu 언급했지만 예상됨 정확히 2.");
  }
  this.name = 이름;
  this.methods = [];
  for(var i = 0, len = method.length; i < len; 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 호출됨"
               인수.길이 "인수, 하지만 최소 2개 이상 예상됩니다.");
  }
for(var i = 1, len = 인수.길이; i     var 인터페이스 = 인수[i];     }
    for(var j = 0, 메소드 Len = 인터페이스.메소드.길이; j < 메소드Len; j ) {
      var 메소드 = 인터페이스.메소드[j];
      if(!object[메서드] || typeof 객체[메서드] !== 'function') {
        throw new Error("Function Interface.ensureImplements: object "
                 "는 "인터페이스를 구현하지 않습니다. .name " 인터페이스. " method " 메소드를 찾을 수 없습니다.");
      }
    }
  }
};



何时使用接口?

一直使用严格的类型验证并不适合,因为大数javascript程序员已经에는 있습니다接口와接口验证的情况下编程더 많은 년.但实际上他让你的代码变得更加的松耦合.他使你你你的代码变得更加灵活,你可以传送任何类型的变weight,并且保证他有你想要的要的要的要活更很多场景接以传送任何使사용。 여기에는 一个大型系统里,很多程序员一起参与开发项目,接为其他程序员提供别人依赖的 一个方法存根, 这种情况下, 接口变得当的有价值.他们可以文档化api,并作为编程的契约。当存根被实现的api替换的时候你能立即知道,如果在开发过程中api有所变动,他能被另一个实现该接口적방법은 无缝替换입니다. 如何使用接口?
首先要解决的问题是, 는 你的代码中是否适使用接口.复杂島。所以你要确况下,是否是益处大于弊端。如果要使用接口,下面有几条建议:
1.引用인터페이스 类到你的页面文件。interface 源文件你可以再如下站点找到: http://jsdesignpatterns.com /.
2.检查你的代码, 确要抽象到接밖의 방법.
3.创建接口对象, 没个接口对象里面包含一组关적방법.
4.移除所有构造器验证,我们将使用第三种接口实现方式,也就是鸭子类型。
5.용Interface.ensureImplements替代构造器验证。
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.