source

기본 클래스의 멤버에 액세스하는 중

gigabyte 2023. 3. 5. 09:51
반응형

기본 클래스의 멤버에 액세스하는 중

TypeScript 사이트의 놀이터에서 상속 예를 참조하십시오.

class Animal {
  public name;
  constructor(name) {
    this.name = name;
  }
  move(meters) {
    alert(this.name + " moved " + meters + "m.");
  }
}

class Snake extends Animal {
  constructor(name) {
    super(name);
  }
  move() {
    alert("Slithering...");
    super.move(5);
  }
}

class Horse extends Animal {
  constructor(name) {
    super(name);
  }
  move() {
    alert(super.name + " is Galloping...");
    super.move(45);
  }
}

var sam = new Snake("Sammy the Python");
var tom: Animal = new Horse("Tommy the Palomino");

sam.move();
tom.move(34);

코드의 한 줄을 변경했습니다.경고:Horse.move()액세스 하고 싶다.super.name하지만, 그것은 단지undefinedIntelliSense는 제가 사용할 수 있고 TypeScript가 정상적으로 컴파일되지만 동작하지 않습니다.

좋은 생각 있어요?

작업 예아래의 주의사항.

class Animal {
    constructor(public name) {
    }

    move(meters) {
        alert(this.name + " moved " + meters + "m.");
    }
}

class Snake extends Animal {
    move() {
        alert(this.name + " is Slithering...");
        super.move(5);
    }
}

class Horse extends Animal {
    move() {
        alert(this.name + " is Galloping...");
        super.move(45);
    }
}

var sam = new Snake("Sammy the Python");
var tom: Animal = new Horse("Tommy the Palomino");

sam.move();
tom.move(34);
  1. 공용 변수에 이름을 수동으로 할당할 필요가 없습니다.사용.public name컨스트럭터 정의에서 이 작업을 수행할 수 있습니다.

  2. 전화 안 해도 돼super(name)전문계급에서요.

  3. 사용.this.name작동하다.

사용에 관한 주의사항super.

이에 대한 자세한 내용은 언어 사양 섹션 4.9.2를 참조하십시오.

에서 상속되는 클래스의 동작Animal는 다른 언어의 동작과 다르지 않습니다.다음을 지정해야 합니다.super특정 함수와 기본 클래스 함수 간의 혼동을 피하기 위해 키워드를 지정합니다.예를 들어, 전화했을 경우move()또는this.move()전문 기술자를 상대하게 될 것입니다.Snake또는Horse기능하기 때문에super.move()는 베이스 클래스 함수를 명시적으로 호출합니다.

인스턴스의 속성이기 때문에 속성이 혼동되지 않습니다.와는 차이가 없다.super.name그리고.this.name- 심플하게this.name그렇지 않으면 전문 클래스인지 기본 클래스인지에 따라 다른 이름을 가진 말을 만들 수 있습니다.

키워드를 사용하고 있습니다.super그리고.this잘못되어 있습니다.다음은 올바른 예시를 제시합니다.

    class Animal {
        public name: string;

        constructor(name: string) { 
            this.name = name;
        }

        move(meters: number) {
            console.log(this.name + " moved " + meters + "m.");
        }
    }
    
    class Horse extends Animal {
        move() {
            console.log(super.name + " is Galloping...");
            console.log(this.name + " is Galloping...");
         
            super.move(45);
        }
    }
    
    var tom: Animal = new Horse("Tommy the Palomino");
    
    Animal.prototype.name = 'horseee'; 
    
    tom.move(34);
    // Outputs:
    
    // horseee is Galloping...
    // Tommy the Palomino is Galloping...
    // Tommy the Palomino moved 45m.

설명:

  1. 첫 번째 로그는 다음 다이내믹 값을 기록합니다.super.name이 값은 정적 문자열 값으로 진행됩니다."is Galloping...". 키워드this오브젝트의 "슬롯 체인"을 참조합니다.tom오브젝트가 아닌tom자체입니다. 왜냐하면 우리는 이름 속성을Animal.prototype, 말이 출력됩니다.

  2. 두 번째 로그 출력this.name,그this키워드는 Tom 객체 자체를 나타냅니다.

  3. 세 번째 로그는 다음 명령어를 사용하여 기록됩니다.moveAnimal base 클래스의 메서드.이 메서드는 구문을 사용하여 Hors 클래스 이동 메서드에서 호출됩니다.super.move(45);. 사용방법super이 컨텍스트의 키워드는,move방법은 동물 프로토타입에 있는 프로토타입 체인에서 찾을 수 있습니다.

TS는 여전히 후드 밑의 프로토타입을 사용합니다.class그리고.extends키워드는 단지 원형적 유전보다 통사적인 설탕일 뿐입니다.

언급URL : https://stackoverflow.com/questions/13121431/accessing-member-of-base-class

반응형