JavaSctipt의 프로토타입 원형 깊이 분석: 프로토타입의 속성은 복사본, 인용입니까, 아니면 고정된 검색 방식입니까?(1): 프로토타입 속성 수정
----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에서 찾은 것도 원형의 속성 값입니다!- 프로토타입만 수정하고 고정된 검색 방식으로 찾으면 이 예시를 해독할 수 있습니다!
전체 텍스트 되돌리기
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
콜백 함수를 Angular 하위 구성 요소에 전달이 예제는 구성 요소에 함수를 전달하는 것과 관련하여 최근에 직면한 문제를 다룰 것입니다. 국가 목록을 제공하는 콤보 상자 또는 테이블 구성 요소. 지금까지 모든 것이 구성 요소 자체에 캡슐화되었으며 백엔드에 대한 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.