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