소개하다
모든 프로그래밍은 코드 재사용을 제안합니다. 그렇지 않으면 새 프로그램을 개발하거나 새로운 기능을 작성할 때마다 새 프로그램을 작성 해야하는 경우 폐기물이됩니다. 그러나 코드 재사용도 좋거나 나쁘다. 다음 두 기사에서는 코드 재사용에 대해 논의 할 것입니다. 첫 번째 기사는 이러한 패턴의 사용을 가능한 한 많이 사용하지 않습니다. 왜냐하면 그것은 약간의 문제를 초래하기 때문입니다. 두 번째 행은 권장 사항이며 모든 사람이 사용하는 권장 패턴을 나타내며 일반적으로 문제가 없습니다.
모드 1 : 기본 모드
모든 사람이 일반적으로 사용하는 기본 모드의 코드 재사용에 문제가 종종 있습니다. 이 모드는 Parent ()의 생성자를 사용하여 객체를 생성하고 child () 프로토 타입에 객체를 할당합니다. 코드를 살펴 보겠습니다.
코드 사본은 다음과 같습니다.
함수 상속 (c, p) {
C. prototype = new p ();
}
// 상위 생성자
기능 부모 (이름) {
this.name = name || '아담';
}
// 프로토 타입에 함수를 추가합니다
parent.prototype.say = function () {
이 this.name;
};
// 자식 생성자가 비어 있습니다
기능 자식 (이름) {
}
// 상속을 실행합니다
상속 (자녀, 부모);
var kid = new Child ();
console.log (kid.say ()); // "아담"
var kiddo = new child ();
kiddo.name = "Patrick";
console.log (kiddo.say ()); // "패트릭"
// 단점 : 매개 변수를 아동 생성자로 전달할 수 없습니다.
var s = 새로운 아이 ( 'seth');
Console.log (s.say ()); // "아담"
이 모드의 단점은 자식이 기본적으로 쓸모없는 매개 변수를 전달할 수 없다는 것입니다.
패턴 2 : 빌린 생성자
이 패턴은 아동이 부모의 생성자를 빌려 신청 한 다음 아동의 this와 매개 변수를 적용 방법으로 전달한다는 것입니다.
코드 사본은 다음과 같습니다.
// 상위 생성자
기능 부모 (이름) {
this.name = name || '아담';
}
// 프로토 타입에 함수를 추가합니다
parent.prototype.say = function () {
이 this.name;
};
// 자식 생성자
기능 자식 (이름) {
parent.apply (이것, 인수);
}
var kid = new Child ( "Patrick");
Console.log (kid.name); // "패트릭"
// 단점 : Say 메소드는 생성자로부터 상속되지 않습니다.
console.log (typeof kid.say); // "한정되지 않은"
단점은 또한 명백하며, 상속되지 않았기 때문에 Say 메소드를 사용할 수 없습니다.
패턴 3 : 생성자를 빌려 프로토 타입을 설정하십시오
위의 두 모드에는 고유 한 단점이 있으므로 두 가지 단점을 제거하는 방법은 무엇입니까? 시도해 봅시다 :
코드 사본은 다음과 같습니다.
// 상위 생성자
기능 부모 (이름) {
this.name = name || '아담';
}
// 프로토 타입에 함수를 추가합니다
parent.prototype.say = function () {
이 this.name;
};
// 자식 생성자
기능 자식 (이름) {
parent.apply (이것, 인수);
}
child.prototype = new Parent ();
var kid = new Child ( "Patrick");
Console.log (kid.name); // "패트릭"
console.log (typeof kid.say); // 기능
console.log (kid.say ()); // 패트릭
Console.dir (Kid);
kid.name 삭제;
console.log (kid.say ()); // "아담"
실행되면 모든 것이 정상이지만 부모 생성자가 두 번 실행되었다는 것을 알았으므로 프로그램을 사용할 수 있지만 매우 비효율적입니다.
모드 4 : 공유 프로토 타입
공유 프로토 타입은 아동과 부모가 동일한 프로토 타입을 사용한다는 것을 의미합니다. 코드는 다음과 같습니다.
코드 사본은 다음과 같습니다.
함수 상속 (c, p) {
C. prototype = p.prototype;
}
// 상위 생성자
기능 부모 (이름) {
this.name = name || '아담';
}
// 프로토 타입에 함수를 추가합니다
parent.prototype.say = function () {
이 this.name;
};
// 자식 생성자
기능 자식 (이름) {
}
상속 (자녀, 부모);
var kid = new Child ( 'Patrick');
Console.log (kid.name); // 한정되지 않은
console.log (typeof kid.say); // 기능
kid.name = 'Patrick';
console.log (kid.say ()); // 패트릭
Console.dir (Kid);
동일한 것이 사실이며, 아동의 매개 변수는 올바르게 수신되지 않습니다.
패턴 5 : 임시 생성자
먼저, 생성자를 빌린 다음 아동 프로토 타입을 빌린 생성자의 인스턴스로 설정하고 마지막으로 아동 프로토 타입의 생성자를 복원하십시오. 코드는 다음과 같습니다.
코드 사본은 다음과 같습니다.
/* 폐쇄*/
var inherit = (function () {
var f = function () {
};
반환 함수 (c, p) {
f. prototype = p.prototype;
C. prototype = 새로운 f ();
c.uber = p.prototype;
C. prototype.constructor = C;
}
} ());
기능 부모 (이름) {
this.name = name || '아담';
}
// 프로토 타입에 함수를 추가합니다
parent.prototype.say = function () {
이 this.name;
};
// 자식 생성자
기능 자식 (이름) {
}
상속 (자녀, 부모);
var kid = new Child ();
Console.log (kid.name); // 한정되지 않은
console.log (typeof kid.say); // 기능
kid.name = 'Patrick';
console.log (kid.say ()); // 패트릭
var kid2 = 새로운 어린이 ( "Tom");
console.log (kid.say ());
Console.log (kid.constructor.name); // 어린이
Console.log (kid.constructor === Parent); // 거짓
문제는 여전히 동일하지만, 아이는 정상적으로 매개 변수를받을 수 없습니다.
모드 6 : klass
이 패턴의 코드부터 시작하겠습니다.
코드 사본은 다음과 같습니다.
var klass = 함수 (부모, 소품) {
var child, f, i;
// 1.
// 새 생성자
child = function () {
if (child.uber && child.uber.hasownproperty ( "__ construct")) {
child.uber .__ 구성.
}
if (child.prototype.hasownproperty ( "__ construct")) {
child.prototype .__ construct.Apply (이, 인수);
}
};
// 2.
// 상속
부모 = 부모 || 물체;
f = function () {
};
f. prototype = parent.prototype;
child.prototype = new f ();
child.uber = parent.prototype;
child.prototype.constructor = child;
// 3.
// 구현 방법을 추가합니다
for (i in props) {
if (props.hasownproperty (i)) {
child.prototype [i] = props [i];
}
}
// "클래스"를 반환합니다.
귀환 아이;
};
var man = klass (null, {
__ 구성 : 기능 (What) {
Console.log ( "사람의 생성자");
this.name = 뭐;
},
getName : function () {
이 this.name;
}
});
var first = New Man ( 'Adam'); // "사람의 생성자"로그
First.getName (); // "아담"
var superman = klass (man, {
__ 구성 : 기능 (What) {
Console.log ( "슈퍼맨의 생성자");
},
getName : function () {
var name = superman.uber.getname.call (this);
"I Am" + 이름을 반환합니다.
}
});
var clark = New Superman ( 'Clark Kent');
clark.getName (); // "나는 클라크 켄트"
Console.log (Clark instanceof man); // 진실
Console.log (Clark instance of Superman); // 진실
어때? 보는 것이 조금 어지럽습니까? 친절하게,이 패턴의 문법과 사양은 다른 언어와 동일합니다. 당신은 그것을 기꺼이 사용 하시겠습니까? 기침. . .
요약
위의 6 가지 모드는 특정한 특별한 상황에서 특정 기능을 구현하지만 모두 고유 한 단점이 있으므로 일반적으로 모든 사람은 사용하지 않아야합니다.