찾다

 >  Q&A  >  본문

javascript - JS의 생성자 및 생성자 관련 문제

으아아아

코드에 언급된 대로 superSay.call(this)为什么会是People.prototype.say函数被调用?this가 가리키는 사람은 누구인가요?

我想大声告诉你我想大声告诉你2798일 전790

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

  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-06-26 10:55:14

    확인을 위해 Student{}类,这个你可以在superSay.call(this)上面加一行console.log(this)를 가리킵니다.

    그럼 이 코드를 살펴보겠습니다

    으아악

    나중에 설명의 편의를 위해 여기서는 new People()이 생성한 인스턴스를 Instance X라고 부릅니다. new People()创建的实例称为实例X
    由于superSay = Student.prototype.say,因为上面的Student.prototype = new People();,所以其中Student.prototype实例X
    所以实际上superSay调用的是实例Xsay,而并非People.prototype.saysuperSay = Student.prototype.say이고 위의 Student.prototype = new People();이므로 Student.prototypeInstanceX.

    실제로 superSayPeople.prototype.say가 아닌 Instance Xsay를 호출합니다.

    People.prototype.say,主要还是原型链的问题。实例X是People类的一个实例,所以实例X的所有方法会从People类的原型链“继承”(用继承这个词,但是实际上JS的原型链和继承还是有些区别的)。所以实例X.say如果没有针对实例X重写say方法,那么实例Xsay就和People.prototype.say전화하는 것과 동일하다고 생각하는 이유는

    .

    superSay.call(this)这个里面的call,只是改变了this的上下文而已。但是由于superSay实例X.say,这个方法里根本没有this,所以this또한

    컨텍스트 수정은 작업 결과에 영향을 미치지 않습니다.

    🎜

    회신하다
    0
  • 迷茫

    迷茫2017-06-26 10:55:14

    이 문제는 js에서 자주 발생합니다

    회신하다
    0
  • 代言

    代言2017-06-26 10:55:14

    개인 의견: 먼저 say 메소드를 찾는 검색 순서에 대해 이야기해 보겠습니다. s——student.prototype——people.prototype——Object를 찾으면 준비가 된 것이며 검색을 중지합니다. 코드와 결합하면 Student.prototype만 찾을 수 있습니다. 여기에서 먼저 코드를 다음과 같이 변경하여 더 명확하게 만들 수 있습니다.

    으아악

    기타 사항은 변경되지 않습니다. 이때 s.say() - 321을 출력하고, s.jiao() - 456을 출력합니다. 그런 다음 Student.prototype.say 메소드를 재정의했기 때문에 코드로 돌아가서 이 코드가 실행됩니다

    으아악

    첫 번째 문장 superSay.call(this), 우선 superSay는 변수이고, 변수 유형은 함수입니다. var superSay = Student.prototype.say 뒤에 console.log(typeof supperSay) 코드를 추가하면 됩니다. , 따라서 이 함수를 호출하면 이 변수에 Student.prototype.say가 저장됩니다. var superSay = Student.prototype.say로 실행합니다. 실제로 여기에 할당된 값은 People.prototype.say입니다. 이 점은 Elevation의 166-167페이지에서도 비슷합니다. 이 점과 관련하여 코드의 두 섹션을 이것으로 변경하고 나머지는 변경하지 않을 수 있습니다.

    으아악

    이 때 superSay를 호출하면 오류가 보고됩니다. var superSay = Student.prototype.say가 실행될 때 Student.prototype에는 생성자 속성이 하나만 있고 say 메서드가 없기 때문입니다. 그런 다음 코드로 돌아가면 People.prototype.say가 superSay

    에 할당됩니다. 으아악

    회신하다
    0
  • 我想大声告诉你

    我想大声告诉你2017-06-26 10:55:14

    superSay 생성자에서 이것을 Student.prototype에 바인딩합니다.

    회신하다
    0
  • PHP中文网

    PHP中文网2017-06-26 10:55:14

    위층의 잡담에 포스터가 속아버릴까 두렵지 않으신가요?

    그의 프로그램에서 stuSay는 익명의 함수 객체 function(){alert("hello");}을 가리킵니다. stuSay를 다시 할당하지 않는 한, 어디서 호출하든 항상 이 함수 객체를 가리킵니다. , 항상 이렇습니다. 따라서 이것이 함수 본문 내부에서 누구를 가리키는지는 Rhinoceros 책을 읽어보세요...

    코뿔소 책의 기능 부분을 읽으면 포스터에 이런 문제가 없을 것입니다. 위층에 너무 많은 말도 안 되는 일이 있어서 포스터를 현기증나게 하지 마세요

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