참조 유형
참조 유형은 주로 객체 유형, 배열 유형, 날짜 유형, Regexp 유형, 기능 유형 등을 포함합니다.
참조 유형을 사용하는 경우 객체 (인스턴스)를 생성해야합니다. 다시 말해, 참조 유형은 템플릿과 동일합니다. 특정 참조 유형을 사용하려면이 템플릿을 사용하여 사용할 객체를 생성해야하므로 참조 유형을 객체 정의라고합니다.
예를 들어, 누군가의 개인 정보와 행동을 정의하기 위해 사람 객체를 생성해야하므로 객체 유형에 의존해야합니다.
var person = new Object (); person.name = "jiangshui"; person.sayname = function () {console.log (this.name);}위의 사람 객체는 객체 유형을 사용하여 새 연산자를 사용하여 "템플릿"에 의해 정의됩니다. 그런 다음이 개체에 속성 이름과 메소드 SayName을 추가 할 수 있습니다. 속성과 방법은 객체 유형의 "함수"이므로 객체와 같은 참조 유형을 통해 생성 된 객체를 사용할 수 있습니다.
객체를 만드는데 반드시 새 연산자를 사용해야하는 것은 아닙니다. 생성에서 단순화 할 수있는 몇 가지 유형이 있습니다. 예를 들어, 위와 같이 유형 객체의 객체를 작성하면 다음 두 가지 방법을 사용할 수도 있습니다.
var person = {}; person.name = "jiangshui"; person.sayname = function () {console.log (this.name);}또는
var person = {name : "jiangshui", sayname : function () {console.log (this.name); }};{} 연산자의 기능은 새로운 개체 (), 단순화 작업과 동일합니다. 위의 두 글쓰기 방법에는 몇 가지 차이가 있습니다. 첫 번째는 "부록"입니다. 즉, 이전 정의에서는 속성이나 메소드를 계속 추가합니다. 동일한 이름의 속성 메소드가 이미 이전에 존재하면 덮어 씁니다. 두 번째 유형은 "교체"입니다. 즉, 사람 객체의 속성과 방법이 이전에 정의되었는지 여부에 관계 없이이 메소드는 이전에 정의 된 내용을 새로 정의 된 내용으로 대체합니다. 참조 유형에 의해 생성 된 객체는 메모리에 저장된 영역이므로 포인터가 특정 변수 (Person)에 저장되므로 두 번째로 쓰는 방법은 새 개체 (새 메모리 영역)를 생성 한 다음 사람을 새 메모리 영역으로 가리키는 것이므로 이전 객체가 교체됩니다. 이것을 이해하는 것은 나중에 이해하는 데 중요합니다.
다른 참조 유형의 사용은 배열 유형과 같이 거의 동일하며, 이는 객체를 생성하거나 직접 정의하는 데 사용될 수 있습니다. 배열 객체를 생성 한 후 정보 내용을 배열 형식으로 저장할 수 있습니다. 또한 객체는 푸시, 시프트, 정렬 등과 같은 배열 유형에 정의 된 메소드를 가져 오며 다음과 같은 방법을 호출 할 수 있습니다.
var colors = []; colors.push ( 'red', 'green'); console.log (colors);
위의 코드는 배열 유형을 통해 배열 유형 객체를 생성 한 다음 배열 유형에 이전에 정의 된 푸시 메소드를 호출하고 객체에 빨간색과 녹색을 추가하고 마지막으로 콘솔에서 인쇄하여 볼 수 있습니다.
메소드를 호출하고 적용하십시오
이 두 가지 방법은 함수 유형에 의해 제공되므로 함수에 사용할 수 있습니다. 호출 기능은 적용 메소드와 동일하며 기능 작동 범위를 확장 할 수 있습니다. 차이점은 통화를 사용할 때 함수에 전달 된 매개 변수를 하나씩 나열해야하지만 적용 메소드는 사용하지 않는다는 것입니다. 이런 식으로, 자신의 기능의 요구 사항에 따라 전화를 사용하거나 적용하기로 결정할 수 있습니다.
확장 기능 작동 범위는 무엇을 의미합니까? 예를 들어 이해할 것입니다.
기능이 컨테이너 (범위)에 랩핑 되며이 컨테이너에는 일부 변수 또는 기타 사항이 있음을 이해할 수 있습니다. 함수가 실행되면 이러한 변수가 호출되면 현재 컨테이너에서 찾을 수 있습니다. 이 컨테이너는 실제로 더 큰 컨테이너를 외부로 감습니다. 현재 작은 컨테이너가 없으면 기능이 큰 컨테이너에서 검색하고 가장 큰 컨테이너 창 객체를 찾습니다. 그러나 현재 작은 컨테이너에서 함수가 실행되는 경우, 작은 컨테이너에는 큰 컨테이너에도 해당 변수 등이 있습니다.
호출 및 적용 방법은이 문제를 해결하고 컨테이너의 한계를 뚫는 것입니다. 이전 예제는 다음과 같습니다.
var person = {name : "jiangshui", sayname : function () {console.log (this.name); }};크롬 콘솔을 열면 붙여 넣고 실행 한 다음 person.sayname ()을 실행하여
현재 사람은 컨테이너로 SayName 메소드 (함수)를 만듭니다. 실행할 때는 개인 범위에서 실행해야합니다. 하단에서 직접 실행되면, 즉 창의 범위에서 실행하면 SayName 메소드가 창 아래에 정의되지 않기 때문에 오류가 정의되지 않습니다. 이 포인터 내부는 현재 범위를 가리키는 특별한 것입니다. 이름은 이름 값을 현재 범위 아래로 호출하는 것입니다.
다음으로 Window 객체에 이름 속성을 추가합니다.
Window.name = "Yujiangshui";
또는 직접
이름 = "Yujiangshui";
창은 가장 큰 컨테이너이기 때문에 창을 생략 할 수 있습니다. 정의 된 모든 속성 또는 변수는 창에 첨부됩니다. 믿지 않으면 다음을 볼 수 있습니다.
이제 우리는 큰 창 컨테이너 아래에 작은 컨테이너에서 SayName 메소드를 실행하고 싶습니다. SayName 메소드의 범위를 확장하려면 전화를 사용하거나 적용해야합니다. 다음 진술을 실행하십시오.
person.sayname.call (창);
또는
person.sayname.call (this);
출력 결과는 동일합니다. 이 데모는 너무 간단하고 전달 매개 변수가 필요하지 않으므로 호출 및 적용 기능이 완전히 일관되기 때문에 적용을 사용하여 효과를 확인할 수 있습니다.
위의 코드를 설명하겠습니다. SayName은 먼저 호출 메소드와 적용 메소드가있는 함수 유형의 인스턴스입니다. 통화 및 적용 방법은 기능 방법이므로 person.sayname.call (Window)을 Person.sayName (). Call (Window) 등으로 호출해야합니다.
그런 다음 통화 및 적용 메소드의 매개 변수는 범위 (개체)이며, 이전 함수가 전달 된 스코프에서 실행됨을 나타냅니다. Window 객체를 전달한 후 SayName 메소드의 이름은 Window.Name을 가리므로 범위가 확장됩니다.
통과 된 창과 이것은 같은 효과가있는 이유는 무엇입니까? 이 기능을 실행하는 현재 위치는 앞에서 언급했듯이 Window 이므로이 포인터는 현재 범위를 가리 므로이 포인터는 창을 가리키므로 창과 같습니다.