JavaSctipt의 프로토타입 원형 깊이 분석: 프로토타입의 속성은 복사본, 인용입니까, 아니면 고정된 검색 방식입니까?(1): 프로토타입 속성 수정

JavaSctipt의 프로토타입 원형 깊이 분석: 프로토타입의 속성은 복사본, 인용입니까, 아니면 고정된 검색 방식입니까?
                                      ----01_prototype 속성 수정
//
  	<script type="text/javascript">
  
  	var Person  = function()
  	{
  	};
  	
  	Person.prototype.username = new String("zhangsan");
  	
  	var person1 = new Person();
  	var person2 = new Person();
  	
  	alert(" ,person1.username: "+person1.username);
  	alert(" ,person2.username: "+person2.username);
  	
  	
  	// :
  	Person.prototype.username = new String("lisi");
  	
  	
  	alert(" ,person1.username: "+person1.username);
  	alert(" ,person2.username: "+person2.username);
  	
  	
  	
  	</script>
  	

//
출력:
실례를 만든 후,person1.username:zhangsan 실례를 만든 후person2.username:zhangsan 원형이 수정된 후,person1.username:lisi 원형이 수정된 후,person2.username: lisi  
    
문제: 왜 원형의 속성 값이 수정된 후에 2개의 실례person1,person2의 속성 값도 바뀌었습니까?
가설 1 사본:
N개의 실례가 생성될 때 원형의 속성의 사본을 가지고 원형의 속성이 수정된 후에 N개의 실례에 있는 속성 값을 수정합니다(N차 수정).
이렇게 하면 원형의 속성 값이 바뀐 후에 실례의 복사본 값을 수정합니다.-N차 수정은 불가능하겠지!가설 2 참조: N개의 인스턴스가 생성될 때 원형 속성의 참조가 있습니다. 이때 Person.prototype.username과 person.username은 Person과 같은 객체인 String("zhangsan")을 참조합니다.prototype.username = new String("lisi")이 실행되면 Person.prototype.usename는 새로운 대상인 String("lisi")을 인용하고, 이어서 N개의 실례에 있는 username 속성을 수정하여, username도 같은 대상인 String("lisi")을 인용하도록 합니다.이렇게 원형의 속성이 새로운 대상을 인용한 후, 실례의 속성도 같은 새로운 대상을 인용한다.-N차 수정을 해야 하는데, 이 가능성도 높지 않다.가령 3 고정 검색 방식: N개의 실례를 만들 때 원형과 같은 이름의 속성이 없습니다. 예를 들어person이 만들 때 그 자체는username 속성이 없습니다!방문자가 되다.username을 사용할 때, 그 자체는 username 속성이 없기 때문에 고정된 검색 방식에 따라 찾습니다.
person은 Person의 실례이기 때문에 Person을 찾습니다.prototype의 속성을 찾지 못하면 계속 상위 원형으로 찾습니다. 여기서 js엔진은Person을 찾았습니다.prototype.username 속성, 그래서 출력!
이 검색 방식 때문에 원형의 속성 값을 수정하면Person.prototype.username 후, 추가 조작이 필요하지 않습니다!그래서 원형의 속성 값이'lisi'로 수정된 후person1.username에서 찾은 것도 원형의 속성 값입니다!- 프로토타입만 수정하고 고정된 검색 방식으로 찾으면 이 예시를 해독할 수 있습니다!
전체 텍스트 되돌리기

좋은 웹페이지 즐겨찾기