자 바스 크 립 트 의 대상 을 깊이 깨닫다

4597 단어
자 바스 크 립 트 는 대상 을 대상 으로 합 니 다.그러나 많은 사람들 이 이 점 에 대해 전면적으로 이해 하지 못 한다.
자 바스 크 립 트 에서 대상 은 두 가지 로 나 뉜 다.'일반 대상' 이 라 고 할 수 있 는 것 은 바로 우리 가 보편적으로 이해 하 는 숫자, 날짜, 사용자 정의 대상 (예 를 들 어 {}) 등 이다.
또 하 나 는 '방법 대상' 이 라 고 부 르 는데 우리 가 일반적으로 정의 하 는 function 이다.당신 은 이상 하 게 생각 할 수 있 습 니 다. 방법 은 방법 입 니 다. 어떻게 대상 이 되 었 습 니까?그러나 자 바스 크 립 트 에서 방법 은 확실히 대상 으로 처리 된다.다음은 간단 한 예 이다.
 
  
 function func() {alert('Hello!');}
 alert(func.toString());

이 예 에서 func 는 하나의 방법 으로 정의 되 었 지만 그 자체 에는 toString 방법 이 포함 되 어 있 습 니 다. 이것 은 func 가 여기 서 하나의 대상 으로 처리 되 었 음 을 설명 합 니 다.더 정확히 말 하면 func 는 '방법 대상' 이다.다음은 예 의 계속 입 니 다.
 
  
func.name = “I am func.”;
alert(func.name);

우 리 는 임의로 func 에 속성 을 설정 할 수 있 습 니 다. 이것 은 func 가 하나의 대상 임 을 증명 합 니 다.그렇다면 방법 대상 과 일반 대상 의 차 이 는 어디 에 있 을 까?우선 방법 대상 은 당연히 실행 할 수 있 습 니 다. 그 뒤에 괄호 를 더 하면 바로 이 방법 을 실행 하 는 대상 입 니 다.
 
  
func();

그래서 방법의 대상 은 이중성 을 가진다.한편 으로 는 그것 이 실 행 될 수 있 고, 다른 한편 으로 는 그것 을 완전히 일반적인 대상 으로 사용 할 수 있다.이것 은 무엇 을 의미 합 니까?방법 대상 이 다른 대상 에 게 완전히 독립 할 수 있다 는 뜻 이다.이 점 은 자바 와 비교 해 볼 수 있다.자바 에 서 는 방법 이 하나의 클래스 에서 정의 되 어야 하 며, 단독으로 존재 할 수 없습니다.자 바스 크 립 트 에는 필요 없습니다.
방법 대상 이 다른 방법 에 독립 된 것 은 그것 이 임의로 인용 되 고 전 달 될 수 있다 는 것 을 의미한다.다음은 하나의 예 이다.
 
  
function invoke(f) {
     f();
 }
invoke(func);

하나의 방법 대상 func 를 다른 방법 대상 invoke 에 전달 하여 후자 가 적당 한 시기 에 func 를 실행 하도록 합 니 다.이것 이 바로 이른바 '반전' 이다.또한 방법 대상 의 이러한 특수성 으로 인해 this 키 워드 를 파악 하기 가 쉽 지 않다.이 방면 에는 관련 문장 이 적지 않 으 니, 여기 서 는 군말 하지 않 겠 다.
실행 할 수 있 는 것 외 에 방법 대상 은 새로운 키 워드 를 통 해 일반 대상 을 만 들 수 있 는 특별한 기능 도 있다.
모든 방법 대상 이 생 성 될 때 프로 토 타 입 이라는 속성 이 자동 으로 생 긴 다 고 합 니 다.이 속성 은 특별한 점 이 없습니다. 다른 속성 과 마찬가지 로 접근 할 수 있 고 값 을 부여 할 수 있 습 니 다.그러나 우리 가 new 키워드 로 대상 을 만 들 때 prototype 은 역할 을 합 니 다. 그 값 (대상 이기 도 합 니 다) 에 포 함 된 모든 속성 은 새로 만 든 대상 에 복 사 됩 니 다.다음은 하나의 예 이다.
 
  
func.prototype.name=”prototype of func”;
var f = new func();
alert(f.name);

실행 중 두 개의 대화 상자 가 팝 업 됩 니 다. 다음 대화 상 자 는 f 라 는 새 대상 이 func. prototype 에서 name 속성 을 복사 한 것 을 표시 합 니 다.이전 대화 상 자 는 func 가 방법 으로 실행 되 었 음 을 나타 낸다.왜 이 럴 때 func 를 한 번 더 실행 하 느 냐 고 물 어 볼 수도 있 습 니 다.사실 이때 func 를 실행 하 는 것 은 바로 '구조 함수' 의 역할 을 하 는 것 이다.이미지 설명 을 위해 다시 한 번 말씀 드 리 겠 습 니 다.
 
  
function func() {
    this.name=”name has been changed.”
}
func.prototype.name=”prototype of func”;
var f = new func();
alert(f.name);

f 의 name 속성 은 더 이상 "prototype of func" 가 아니 라 "name has been changed" 로 대 체 된 것 을 발견 할 수 있 습 니 다.이것 이 바로 func 라 는 대상 방법 이 가 져 온 '구조 함수' 의 역할 이다.그래서 자바 스 크 립 트 에서 new 키워드 로 대상 을 만 드 는 것 은 다음 세 가지 절 차 를 실 행 했 습 니 다.
1. 새로운 일반 대상 만 들 기;2. 방법 대상 의 prototype 속성의 모든 속성 을 새로운 일반 대상 에 복사 합 니 다.3. 새로운 일반 대상 을 상하 문 으로 집행 방법의 대상 으로 한다."new func ()" 라 는 문구 에 대해 서 는 "func 에서 새로운 대상 을 만 듭 니 다" 라 고 설명 할 수 있 습 니 다.한 마디 로 하면 prototype 이라는 속성의 유일한 특수 한 점 은 새로운 대상 을 만 들 때 입 니 다.
그럼 우 리 는 이 점 을 이용 할 수 있다.예 를 들 어 두 가지 방법 으로 대상 A 와 B 가 있 습 니 다. A 에서 만 든 새로운 대상 에 모든 A. prototype 의 속성 이 포함 되 어 있 으 니 B. prototype 에 부여 하 겠 습 니 다. 그러면 B 에서 만 든 새로운 대상 도 똑 같은 속성 이 있 지 않 습 니까?코드 로 쓰 면 다음 과 같 습 니 다.
 
  
A.prototype.hello = function(){alert('Hello!');}
B.prototype = new A();
new B().hello();

이것 이 바로 JavaScript 의 이른바 '계승' 입 니 다. 실질 적 으로 속성의 복사 입 니 다. 여 기 는 prototype 을 이용 하여 이 루어 집 니 다.prototype 을 사용 하지 않 으 면 순환 을 사용 합 니 다. 효 과 는 같 습 니 다.이른바 '다 중 상속' 이란 자 연 스 럽 게 여기저기 서 복사 한 것 이다.
자 바스 크 립 트 에서 대상 을 향 한 원 리 는 바로 위 에 있 는 것들 입 니 다.처음부터 끝까지 나 는 '클래스' 라 는 개념 을 언급 하지 않 았 다. 왜냐하면 자 바스 크 립 트 는 원래 '클래스' 라 는 것 이 없 기 때문이다.대상 을 대상 으로 클래스 가 없 을 수 있 습 니까?그럼요.먼저 유형 이 있 고 그 다음 에 대상 이 있다 는 것 은 원래 합 리 적 이지 않다. 왜냐하면 유형 은 원래 대상 에서 귀납 한 것 이 고 먼저 대상 이 있 고 그 다음 에 유형 이 있어 야 합 리 적 이기 때문이다.아래 와 같은:
 
  
var o = {}; // 。
o.eat = function(){return "I am eating."}  // ;
o.sleep = function(){return "ZZZzzz..."}  // ;
o.talk = function(){return "Hi!"} // ;
o.think = function(){return "Hmmm..."} // 。

var Human = new Function(); // “ ”。
Human.prototype = o; // “ ” 。

var h = new Human(); // ,
alert(h.talk()) // “ ” !

좋은 웹페이지 즐겨찾기