찾다

 >  Q&A  >  본문

Javascript(OOP)에서 상속 체인의 기본 클래스를 직접 실행하는 방법은 무엇입니까?

저는 3개의 확장 가능한 클래스로 구성된 상속 체인을 작업 중입니다.

Renderer(기본) -> Mailbox(하위) -> MailboxInbox(최종 하위)

각각 자신만의 render方法。孩子只是重写渲染器(基础)render方法最后他们无论如何应该使用渲染器rendermethod(Base< /strong>) 클래스가 있습니다. 내 문제는 Renderer 클래스(createElementWithTextInside)에서 특정 메서드를 실행할 때 Renderer의 render 메서드(Renderer .render())를 정확하게 실행하지 않지만 확장 가능한 클래스 Starts에서 실행한다는 것입니다. 체인의 끝에서. 예를 들어 다음과 같이 탐색이 시작됩니다.

1 - MailboxInbox.render

2 - Mailbox.render

3 - Renderer.render

JS 클래스/상속이 뒤에서 어떻게 작동하는지 이해합니다. Javascript는 객체 프로토타입을 확장하고 스크립트는 이를 반복합니다. 하지만 내 질문은 이 동작을 방지하고 필요할 때 해당 메서드에서 Renderer.render 메서드를 직접 호출할 수 있는 방법입니다.

어쨌든 현재 인스턴스(MailboxInbox)의 를 가리키기 때문에 renderer__selfthis를 저장할 수 없습니다. 또한 .bind/lambda(화살표 기능) 를 사용할 수 없습니다. 왜냐하면 컨텍스트를 저장해야 하기 때문입니다

바이올린

으아악

여기에서는 콘솔에서 렌더링됩니다.

1: 받은편지함 렌더링

2: 메일박스 렌더링

3: 렌더러 렌더링

도와주셔서 감사합니다! 감사합니다!

업데이트

기본적으로 매개변수를 허용할 수 있는 기본 render 클래스가 필요합니다: (el,content)(콘텐츠는 선택 사항) 및 render 类,它可以接受参数:(el,content)(内容是可选的)和Children我想用一些预定义的 elcontent 等在他们自己的 .render() 方法中覆盖它,但是如果我尝试执行 renderer.render() 方法来自 Renderer 内部,它遍历整个链,我的参数丢失了,因为在 MailboxInbox 中,渲染方法当前没有'不接受任何参数,所以我要么应该让它接受参数并将它们传递到整个链,要么只是在 Renderer 中定义一些专用类,如 baseRenderChildren< /p> 미리 정의된 일부 < code>el 및 content 등은 자체 .render() 메서드에서 이를 재정의하지만 renderer.render()를 실행하려고 하면 메소드는 🎜Renderer🎜 내부에서 나오며 전체 체인을 통과하는데 매개변수가 누락되었습니다. 🎜MailboxInbox🎜에서 렌더링 메소드가 현재 어떤 매개변수도 허용하지 않기 때문에 매개변수를 수락하고 전달해야 합니다. 체인 전체에 걸쳐 또는 🎜Renderer🎜에서 baseRender와 같은 전용 클래스를 정의하고 직접 호출하세요 🎜

P粉718165540P粉718165540319일 전388

모든 응답(1)나는 대답할 것이다

  • P粉618358260

    P粉6183582602024-01-11 12:38:30

    기술적으로는 this.render(el, text);

    로 바꿀 수 있습니다. 으아악

    상속된 속성 조회를 우회합니다. 그러나 이는 일반적으로 좋은 습관이 아니며 상속의 이점을 잃게 됩니다. class

    다행히도 업데이트에서 실제 문제를 확인했습니다.

    이것은 호환되지 않는 서명이 있는 메서드를 잘못 재정의하여

    리히터 대체 원칙을 위반합니다.

    잠재적인 솔루션도 확인했습니다.

    둘 다 좋아요. 후자의 경우 대신 메서드 이름을

    로 지정하지 않는 것이 좋습니다. renderbaseRender,而是推荐类似 renderContent(el, content)renderDefault (el),它们的签名实际上不同 - 并且都可以被覆盖。然而,看看使用两个参数调用时 render 的实现,在我看来,除了调用 el.appendChild(content) 之外,它实际上没有做任何有用的事情,所以我'宁愿完全放弃它并只调用 appendChild (除非您需要覆盖具体行为的能力,例如通过执行 el.prepend(content)

    회신하다
    0
  • 취소회신하다