JavaScript에서 프로토타입은 특정 유형의 모든 인스턴스에서 액세스할 수 있는 속성과 메서드를 정의합니다. 대부분의 경우 메서드가 잘못되면 예상치 못한 상황이 발생할 수 있습니다. (저 같은 초보자는 개체만 어려움을 겪습니다.) 테스트를 통해 이 부분의 지식을 간단하게 요약해 보겠습니다.
기본 유형은 다음과 같이 정의됩니다.
함수 Person(){}
Person.prototype={
constructor:Person,
name:"person",
age:100,
친구: ["a"," b"],
getName:function(){
return this.name;
}
};
두 개의 Person 인스턴스를 정의하고 name 속성을 수정합니다(이 속성은 프로토타입에 정의됨). 테스트 코드는 다음과 같습니다.
var p1=new Person();
var p2=new Person()
document.write(p1.name "
"); //사람
document.write(p2.name "
"); //사람
p1.name="p1";
document.write( p1.name "
"); //p1
document.write(p2.name "
") //사람
document.write(p1 .hasOwnProperty("name") "
"); //true는 객체에 속합니다
document.write(p2.hasOwnProperty("name") "
") / /false는 프로토타입에 속합니다
document.write(Object.keys(p1) "
") //name
document.write(Object.keys(p2) "< ;br/>"); // 비어 있음
document.write(Object.getOwnPropertyNames(Person.prototype) "
"); //constructor,name,age,friends,getName
document.write(Person.prototype.name "< ;br/>"); //person
테스트 결과 p1.name="p1"이 수정되지 않은 것을 확인할 수 있습니다. name 값이지만 인스턴스 p1에 새 name 속성을 추가합니다. 프로토타입의 name 속성을 포함합니다. 후속 판단에서 p1의 name 속성은 이미 프로토타입 속성이 아닌 인스턴스 속성임을 알 수 있습니다. (p1)에도 p1의 인스턴스가 많이 있음을 알 수 있습니다. 이름 속성은 있지만 p2에는 없습니다. js의 모든 전송은 값으로 이루어집니다. 이 값은 참조 유형에 대한 포인터일 수 있으므로 등호는 참조 개체를 수정하는 것이 아니라 원래 참조 관계를 전환하는 것을 의미합니다.
var obj=new Object()
obj. name="obj";
functionchangeObj(o){
o.name="changed";
o=new Object()
o.name="newObj";
}
changeObj(obj);
document.write(obj.name); //changed
changedObj 메서드에서 o=new Object() 매개변수 o의 값은 수정되지 않았지만 원래의 참조 관계가 끊어져서 결과는 newObj가 아니고 변경되었습니다
다음으로 첫 번째 예의 프로토타입에서 friends 속성의 수정을 테스트합니다. 속성은 참조 유형
p1.friends. push("c") ;
document.write(p1.friends "
") //a,b,c
document.write(p2.friends "
p1.friends=["x","y","z"];
document.write(p1.friends "
"); / /x,y,z
document.write(p2.friends "
"); //a,b,c
document.write(p1 .hasOwnProperty("friends" ) "
"); //true는 객체에 속합니다
document.write(p2.hasOwnProperty("friends") "
") / /false는 프로토타입에 속합니다
document.write(Object.keys(p1) "
") //name,friend
document.write(Object.keys(p2) "
"); //비어 있음
document.write(Object.getOwnPropertyNames(Person.prototype) "
"); //constructor,name,age,friends,getName
document.write(Person.prototype.friends "
"); //a,b,c
이번 테스트 결과는 기본적으로 첫 번째 테스트와 동일합니다. .등호로 수정하면 원래 참조를 잘라내고 인스턴스에 대한 새 속성을 생성한 후 프로토타입에 동일한 이름으로 속성을 덮어씁니다.
이 두 가지 테스트 결과를 바탕으로 발견되었습니다. 프로토타입의 값 유형 속성은 인스턴스에서 직접 수정될 수 없습니다(물론 이 값 유형은 프로토타입에서 정의되어서는 안 됩니다. 여기의 코드 예제는 이 지식 포인트만 설명할 뿐 실제적인 의미는 없습니다).