혼란에는 세 가지 이유가 있습니다. 먼저 정의한 name 속성, 함수 자체에 name이라는 속성이 있어서 이 문제에 대한 이해를 방해합니다. 둘째, 프로토타입이 잘 이해되지 않습니다. 함수의 프로토타입에 정의된 속성의 경우 인스턴스화(즉, 새 작업) 이후의 개체만 "variable.property" 메서드를 사용하여 해당 값을 얻을 수 있습니다. 셋째, 잘 이해되지 않습니다.
메소드를 호출하는 객체를 의미합니다.
질문에 답하기 전에 예시를 살펴보겠습니다
으아악
문제를 하나씩 분석해 보겠습니다 (확인하려면 Chrome 브라우저의 개발자 도구를 사용하세요)
B.callname()은 무엇을 출력하나요?
으아악
B는 함수입니다. 이름은 "B"입니다. B.callname 메서드가 호출되고 호출자는 B입니다. 그러면 callname 메서드의 이 항목이 B를 참조합니다. B.name이 무엇인지 기억하시나요? 이해하려면 위의 첫 번째 예를 살펴보세요.
으아악
B.prototype.name에 "this is B"가 정의되지 않은 이유가 무엇인지 궁금하실 것입니다. B의 프로토타입에 정의된 속성은 B의 인스턴스에서만 직접 액세스할 수 있기 때문입니다. 아직도 믿기지 않는다면 xname 등 이름을 모두 바꾸세요. 그러면 이 질문에 대한 답은 정의되지 않을 것입니다
a.callname() 무엇을 출력하나요?
으아악
a 자체는 JSON에 정의된 객체 인스턴스입니다. 위 코드는
과 동일합니다.
으아악
callname의 호출자는 a이고, callname의 이것은 a
입니다.
으아악
(new B()).callname() 무엇을 출력하나요?
으아악
First, new B()가 먼저 실행되어 익명 인스턴스를 생성합니다. 임시로 이름을 b, 즉 b = new B()로 지정하겠습니다. 이것을 B에서 b라고 부르는데, B함수 본문에 있는 Alert 메소드가 순차적으로 실행됩니다. b는 이름 속성이 없습니다. 상위 클래스의 프로토타입 정의에서 이름을 찾아 "이것은 B입니다"를 찾습니다.new B()先执行, 创建了一个匿名实例,我们暂且给他命名为b, 即 b = new B(), 函数B中的this此时被指代为 b, 然后才是依次执行B函数体内的方法alert, b.name是什么?b是个实例,它本身没有name属性, 就会去父类的prototype定义中找name,找到了 "this is B". 然后, b.callname() 그런 다음 b.callname() code>가 실행됩니다. callname에 정의된 것은 메소드 호출자 b를 참조합니다. 인스턴스 b 자체에는 name 속성이 없습니다. 상위 클래스에서 프로토타입의 속성 값을 찾아서 반환합니다.
첫 번째에서는 이것이 객체 a를 나타내므로 a가 팝업됩니다. 두 번째에서는 B가 함수 B를 나타내고, 세 번째에서는 B가 먼저 나타납니다. 인스턴스화할 때 함수가 실행되기 때문입니다. 그러면 앞의 문(new B())에 세미콜론이 없기 때문에 구문 오류가 발생합니다. 구문 오류가 없으면 인스턴스 객체가 프로토타입 객체의 name 속성을 호출하기 때문에 또 다른 this가 팝업됩니다.
질문에 답하기 전에 예시를 살펴보겠습니다
으아악문제를 하나씩 분석해 보겠습니다 (확인하려면 Chrome 브라우저의 개발자 도구를 사용하세요)
B.callname()은 무엇을 출력하나요?
으아악B는 함수입니다. 이름은 "B"입니다. B.callname 메서드가 호출되고 호출자는 B입니다. 그러면 callname 메서드의 이 항목이 B를 참조합니다. B.name이 무엇인지 기억하시나요? 이해하려면 위의 첫 번째 예를 살펴보세요.
으아악B.prototype.name에 "this is B"가 정의되지 않은 이유가 무엇인지 궁금하실 것입니다. B의 프로토타입에 정의된 속성은 B의 인스턴스에서만 직접 액세스할 수 있기 때문입니다.
아직도 믿기지 않는다면 xname 등 이름을 모두 바꾸세요. 그러면 이 질문에 대한 답은 정의되지 않을 것입니다
a.callname() 무엇을 출력하나요?
으아악a 자체는 JSON에 정의된 객체 인스턴스입니다. 위 코드는
과 동일합니다. 으아악callname의 호출자는 a이고, callname의 이것은 a
입니다. 으아악(new B()).callname() 무엇을 출력하나요?
으아악First,
으아악new B()
가 먼저 실행되어 익명 인스턴스를 생성합니다. 임시로 이름을 b, 즉b = new B()
로 지정하겠습니다. 이것을 B에서 b라고 부르는데, B함수 본문에 있는 Alert 메소드가 순차적으로 실행됩니다. b는 이름 속성이 없습니다. 상위 클래스의 프로토타입 정의에서 이름을 찾아 "이것은 B입니다"를 찾습니다.new B()
先执行, 创建了一个匿名实例,我们暂且给他命名为b, 即b = new B()
, 函数B中的this此时被指代为 b, 然后才是依次执行B函数体内的方法alert, b.name是什么?b是个实例,它本身没有name属性, 就会去父类的prototype定义中找name,找到了 "this is B".然后,
b.callname()
그런 다음b.callname() code>가 실행됩니다. callname에 정의된 것은 메소드 호출자 b를 참조합니다. 인스턴스 b 자체에는 name 속성이 없습니다. 상위 클래스에서 프로토타입의 속성 값을 찾아서 반환합니다.
첫 번째에서는 이것이 객체 a를 나타내므로 a가 팝업됩니다. 두 번째에서는 B가 함수 B를 나타내고, 세 번째에서는 B가 먼저 나타납니다. 인스턴스화할 때 함수가 실행되기 때문입니다. 그러면 앞의 문(new B())에 세미콜론이 없기 때문에 구문 오류가 발생합니다. 구문 오류가 없으면 인스턴스 객체가 프로토타입 객체의 name 속성을 호출하기 때문에 또 다른 this가 팝업됩니다.