JavaScript를 잘 배우기 위해서는 프로토타입, 실행, 컨텍스트, 클로저 등 몇 가지 기본 개념을 이해해야 합니다.
프로토타입
자바스크립트 언어에서 프로토타입은 일반적으로 OO를 구현하는 데 사용됩니다. 여기서는 JavaScript의 OO 구현에 대해 너무 많이 논의하지 않고 JS의 개체 메모리 모델에 중점을 둡니다. 시작하기 전에 다음 사항을 명확히 해야 합니다.
1. JS에는 문자열, 숫자, 부울, 객체, 함수와 같은 데이터 유형이 있습니다(참고: 첫 글자는 모두 소문자입니다).
2 "Object", "String", "Date" 및 기타 내장 데이터 유형은 실제로 JS의 함수 이름입니다("alert(typeof Object)"를 사용하여 확인하면 출력이 "function"임). 우리가 일반적으로 "Date"라고 부르는 데이터 유형은 실제로 "new Date"에 의해 생성된 개체입니다.
3. JavaScript에서 객체는 모두 연관 배열(해시 테이블)이며 객체의 속성을 동적으로 지정할 수 있습니다.
4. Firefox에서 "__proto__" 속성을 사용하여 개체의 "프로토타입"을 볼 수 있습니다.
간단한 예를 살펴보겠습니다.
function Person() { this.age = 10; this.name = "test";}Person.prototype = new Object;var p = new Person;alert(p); // 출력 "[object Object]"alert(p.__proto__); // 출력 "[object Object]"
Person 데이터 유형에 " 프로토타입”, 이 프로토타입을 변경하면 생성된 모든 Person 유형 객체에 영향을 미치며, 앞으로 생성되는 Person 유형 객체에도 영향을 미칩니다. 함수의 프로토타입 속성을 지정하면 해당 함수(new 연산자 사용)를 사용하여 생성된 모든 개체 인스턴스에 프로토타입이 포함됩니다. Firefox에서는 "__proto__" 속성을 사용하여 액세스할 수 있습니다.
일반적으로 JS의 객체는 객체 데이터 유형을 상속한다고 말합니다. 이것이 어떻게 반영되나요? 위 프로그램을 약간 수정해 보겠습니다.
function Person() { this.age = 10; this.name = "test";}var p = new Person;alert(p) // 출력 " [object Object]"alert(p.__proto__); // 출력 "[object Object]"alert(p.__proto__.__proto__); // 출력 "[object Object]"alert(p.__proto__.__proto__ == Object.proto__) ; // "true" 출력 경고(p.__proto__.__proto__.__proto__); // "null" 출력
위 프로그램에서 볼 수 있듯이 Person의 "프로토타입"(여기에는 명확한 내용이 없습니다. Person.prototype을 지정하되 기본값을 사용하십시오.) "프로토타입"(p.__proto__.__proto__)은 정확히 Object.prototype이고, Object.prototype은 프로토타입 체인의 끝입니다(자체 조상은 null입니다).
JS에서 Object는 함수이고, 함수의 모든 인스턴스도 Object입니다. 다음 프로그램을 살펴보세요.
/* 객체와 함수는 모두 함수 데이터 유형입니다*/alert(typeof Object); // 출력 "function"alert(typeof Function); * 함수 프로토타입은 빈 함수입니다. */alert(Function.prototype); // 출력 "function() {}"alert(Function.__proto__ == Function.prototype); // 출력 "true"/* 함수는 객체입니다. , 프로토타입 체인의 끝점은 Object.prototype입니다. */alert(Function.__proto__.__proto__ == Object.prototype); //output "true"/* Object는 function*/의 인스턴스입니다. == Function.prototype) ; // "true" 출력 warning(Object.__proto__.__proto__ == Object.prototype); // "true" 출력 Function.prototype을 변경하면 "Object"에 영향을 미치고 Object.prototype을 변경하면 영향을 받습니다. 함수의 모든 인스턴스.