이 기사는 상속에 대한 JavaScript 사용을 요약합니다. 참조를 위해 공유하십시오. 세부 사항은 다음과 같습니다.
예:
다음과 같이 코드를 복사하십시오 :/**
* 구현 서브 클래스는 부모 클래스를 상속하지만 불필요한 속성 및 방법을 생성하지 않습니다.
* @returns {function}
*/
define (function () {
반환 함수 (하위 유형, 슈퍼 타입) {
var proto = new Object (supertype.prototype);
proto.constructor = 하위 유형;
subtype.prototype = 프로토;
};
});
// - - - - - ------------------------------
define (function () {
기능 타조 (S)
{
this.str = s;
this.length = this.str.length;
}
Ostring.prototype.show = function () {
경고 (this.str);
};
오스트링 리턴;
});
// - - - - - ------------------------------
정의 ([ 'inherit', 'Ostring'], function (inherit, ostring) {
기능 wstring (s) {
// 상위 클래스 생성자에게 호출을 사용합니다
Ostring.call (this, s);
this.chlength = 2 * s.length;
}
// 다른 속성을 상속합니다
상속 (WSTRING, OSTRING);
wstring.prototype.add = function (w)
{
경고 (this.str + w);
};
wstring을 반환;
});
예제를 다시보십시오
1. 기능을 사용하여 구현하십시오.
다음과 같이 코드를 복사하십시오 : function person (name) {
this.name = 이름;
}
person.prototype.getName = function () {
이 this.name;
}
기능 저자 (이름, 책) {
this.inherit = person;
this.inherit (이름);
this.books = books;
}
var au = 새로운 저자 ( "Dororo", "학습");
au.name
또는 동등한 :
다음과 같이 코드를 복사하십시오 : function person (name) {
this.name = 이름;
}
person.prototype.getName = function () {
이 this.name;
}
기능 저자 (이름, 책) {
person.call (this, name);
this.books = books;
}
var au = 새로운 저자 ( "Dororo", "학습");
au.getName
이것은 단지 이것을 매개 변수로 취하고, 부모 클래스 사람의 생성자를 호출하고 부모 클래스에 할당 된 모든 도메인을 저자 서브 클래스에 할당하기 때문에, 상위 클래스 개인 생성자 외부에 정의 된 모든 도메인은 상속되지 않습니다. 따라서 위의 예에서는 getName이 Person의 프로토 타입 객체에 정의되므로 au.getName은 정의되지 않습니다 (정의되지 않은).
또한, 서브 클래스의 생성자는 부모 클래스에 의해 서브 클래스의 정의를 덮어 쓰지 않도록 자체 도메인을 정의하기 전에 부모 클래스 생성자를 호출해야합니다. 다시 말해, 저자는 Person.call 이후의 속성 책을 정의합니다. 그렇지 않으면 재산에 의해 직접 쓰여집니다. 동시에, 서브 클래스가 새롭고 인스턴스화 된 후에 프로토 타입을 실행하고, 부모 클래스의 생성자를 호출해야하기 때문에 서브 클래스에서 서브 클래스의 함수 도메인을 정의하기 위해 프로토 타입을 사용하지 않는 것이 가장 좋습니다.
2. 프로토 타입을 사용하여 구현하십시오.
다음과 같이 코드를 복사하십시오 : function person (name) {
this.name = 이름;
}
person.prototype.getName = function () {
이 this.name;
}
기능 저자 (이름, 책) {
this.books = books;
}
author.prototype = 새로운 사람 (이름);
author.prototype.constructor = 저자;
author.prototype.getbooks = function () {
이 책을 반환하십시오.
}
var au1 = 새로운 저자 ( "dororo1", "많이 배우기");
var au2 = 새로운 저자 ( "Dororo2", "Learn Less");
alert (au1.getName ());
alert (au2.getName ());
이 방법은 기능 구현에서 프로토 타입을 상속받을 수 없다는 문제를 피합니다. author.prototype = new Person (name); new Person () 인스턴스는 사람 구성 및 프로토 타입의 모든 속성을 호출합니다. 그러나 단점은 저자.prototype가 인스턴스화되었다는 것입니다. 따라서 서브 클래스가 인스턴스화되면 모든 비 기본 데이터 유형은 참조 사본입니다. 따라서 위의 예에서, 예제 AU1 또는 AU2에 의해 리턴 된 값은 dororo1이다.
3. "하이브리드"를 사용하여 달성하십시오
다음과 같이 코드를 복사하십시오 : function person (name) {
this.name = 이름;
}
person.prototype.getName = function () {
이 this.name;
}
기능 저자 (이름, 책) {
this.base = 새로운 사람 (이름);
for (var key in this.base) {
if (!이 [키]) {
이 [key] = this.base [key];
}
}
이. 책 = 책;
}
var au1 = 새로운 저자 ( "Dororo1", "Work");
var au2 = 새로운 저자 ( "dororo2", "play");
alert (au1.getName ());
alert (au2.getName ());
au1.book;
au2. 책;
확장에 속하며 상위 클래스의 모든 도메인을 서브 클래스로 복사합니다. 위의 두 측면에는 전혀 문제가 없습니다.
기생 조합 모드)
JS 상속은 다른 방법을 통해 구현되는 속성의 상속 및 방법의 상속을 포함합니다.
1. 속성의 상속
속성의 상속은 함수의 실행 환경을 변경하여 달성됩니다. 함수 변경 실행 환경은 두 가지 방법을 사용하여 구현할 수 있습니다 : Call () 및 apply ().
우리는 먼저 동물 "클래스"를 만듭니다 (JS에는 클래스의 개념이 없기 때문에 여기에는 모의가 있습니다. 실제로는 기능 기능 객체 일뿐입니다).
다음과 같이 코드를 복사하십시오 : Function Animal (typename) {
// 현재 메소드의 실행 환경에 대한 속성 유형 이름 추가 (this)
// 그러나 실행 환경 (이)은 결정되기 전에 실행되어야합니다.
this.typename = typeName;
this.colors = [ "빨간색", "while"];
}
// 함수의 프로토 타입에 두 가지 (객체 공유) 메소드를 추가하고 싶습니다.
Animal.prototype.shout = function () {alert ( "i am : -" + this.typename);};
Animal.prototype.eat = function () {alert ( "i am : -" + this.typename)};
//- 사자 정의-"클래스"(실제로 함수)
기능 사자 (Tn) {
//-동물 방법을 실행하고 적용의 첫 번째 매개 변수를 통해이 사자로 동물 실행 환경을 수정하십시오.
// 마찬가지로, Lion 's This는 그것이 누구인지 결정하기 위해 실행해야합니다.
Animal.Apply (this, [ "lion"]); //-부모 클래스의 변수 속성을 상속받습니다. 이것은 새로운 사자이기 때문입니다. 이것은 사자입니다.
}
lion.prototype = Animal.Prototype; // 부모 클래스 메소드를 상속하고 완료하지만 이것은 잘 작성되지 않았습니다. Child Class가 메소드를 추가하면 부모 클래스 에도이 방법이 있습니다. 이것은 포인터 참조입니다
lion.prototype.hunt = function () {
경고 ( "나는 : 사자, 사냥하고 싶다 ~~ ・ ~");
}
var aminm = 새로운 동물 ();
aminm.hunt (); // --- 당신은 서브 클래스 방법에 액세스 할 수 있습니다.
// ---- 그래서이 문제를 해결하는 방법은 무엇입니까? ? ? ? ? ?
// --- 솔루션 : 메소드를 상속 할 때 다음을 작성할 수 있습니다.
lion.prototype = new Animal (); // 부모 클래스 방법을 상속하고 동물 객체를 프로토 타입 프로토 타입에 할당하십시오. 실제로, 그것에도 속성이 있습니다.
var lion = 새로운 lion (); // 새 키워드를 작성하는 것 외에도 라이온 객체의 실행 환경을 라이온 객체 자체로 수정합니다.
// --- 다시 말해서, 새로운 완료 후, 라이온 함수의 이것은 사자 기능 자체이며, 라이온 함수가 호출됩니다.
새로운 키워드 분석 :
새로운 키워드는 매우 훌륭합니다. 이전 코드에서 새 키워드는 다음 작업을 완료합니다.
1) 사자 물체를 보관할 준비를 위해 힙 공간을 열어
2) 라이온 객체 자체의 실행 환경을 수정하여 라이온 함수 의이가 라이온 함수 객체 자체를 가리 킵니다.
3) Lion 클래스의 "생성자"를 호출하고 사자 객체를 만듭니다.
4) Lion Function Object의 힙 주소를 변수 L에 할당 하고이 시점에서 L Lion Function Object를 가리 킵니다.
lion.shout ();
lion.eat ();
그러나이 상속은 단점이 있습니다. 부모 클래스의 생성자는 두 번, 한 번 호출 한 다음 다시 새로 호출됩니다.
이 기사가 모든 사람의 JavaScript 프로그래밍에 도움이되기를 바랍니다.