클래식 Foo와 Foo.getName

2105 단어
function Foo(){
    getName = function(){
        console.log(1);
    };
    return this;
} 

Foo.getName = function(){
    console.log(2);
}

Foo.prototype.getName = function(){
    console.log(3);
}

var getName = function(){
    console.log(4);
}

function getName(){
    console.log(5);
}

Foo.getName();//2

getName();//4

Foo().getName();//1

getName();//1

new Foo.getName()//2

new Foo().getName();//3

new new Foo().getName();//3


출력 설명은 다음과 같습니다.
  • Foo.getName () Foo의 정적 메소드 우선 순위는 메소드 내부 정의보다 높으며 Foo를 호출합니다.getName (), 출력 2
  • getName () function getName () 변수가 향상되었습니다. 선언 후 var getName=function () {...}덮어쓰기, 출력 4
  • Foo().getName () 은 Foo () 함수를 호출하고 되돌려주는this를 호출하면 현재 전역 윈도우가 Foo 내부의this로 바뀌고 getName () 을 호출하면 Foo 내의 getName () 을 호출하여 1을 출력합니다
  • getName () 은 세 번째 단계에서 Foo의this를 윈도우로 덮어썼기 때문에 getName () 을 호출할 때, Foo의 getName () 을 호출합니다. 출력 1
  • new Foo.getName () 은 new (Foo.getName () 와 동일하며 Foo 를 실행합니다.getName(), 2를 출력하고 Foo를 생성합니다.getName () 메서드의 인스턴스..
  • new Foo().getName () 은 (new Foo () 와 같습니다.getName (), 먼저 Foo의 실례를 만들고 실례를 호출하는 getName () 방법을 사용합니다. 이 방법이 없기 때문에 원형 체인에서 찾습니다. 원형은 구조 함수의prototype, 즉 Foo를 호출합니다.prototype.getName (), 출력 3
  • new new Foo().getName () 은 new (new Foo) 와 같습니다.getName (), new Foo () 를 실행합니다.getName(), 6단계에서 알 수 있습니다. 3을 출력하고 Foo를 만듭니다.prototype.getName () 함수의 인스턴스가 반환됩니다

  • 지식

  • 왜 new Foo().getName () 은 new Foo () 를 먼저 연산하고 new Foo는 연산합니다.getName()은 Foo를 먼저 연산합니다.getName?

  • 다음 링크의 우선 순위를 기준으로 두 가지 차이점을 살펴보십시오.
  • new Foo()는 new(매개변수 목록 포함)에 속합니다
  • new Foo는 new에 속합니다(파라메트릭 목록 없음)

  • 매개변수 없음 목록의 우선 순위는 18이고 구성원이 액세스하는 우선 순위는 19로 매개변수 없음 목록보다 높습니다.그래서 new Foo.getName() 먼저 Foo를 실행합니다.getName()
    매개 변수 목록이 있는 우선순위는 19이고 구성원 접근의 우선순위도 19입니다. 연산자 규칙(같은 우선순위, 왼쪽에서 오른쪽으로 실행하는 순서에 따라), new Foo().getName () 은 new Foo () 를 실행하고 new 이후의 실례에 구성원이 접근합니다.getName () 작업이것은 js 연산자의 우선순위 링크입니다. 모든 연산자의 우선순위를 볼 수 있습니다.
    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence

    좋은 웹페이지 즐겨찾기