[JS 기초] 원형 대상 의 일 들 (하나)
7840 단어 자바 script
개념 적 이해
무엇이 원형 대상 입 니까?다음 과 같은 몇 가지 가 있다. 1. 구조 함 수 는 하나의
prototype 속성 이 있 고 구조 함수 의 원형 대상 을 가리킨다.인 스 턴 스 는 하나의 __proto__ 속성 이 있 고 원형 대상 을 가리킨다.PS: 정확히 말 하면 인 스 턴 스 가 원형 대상 을 가리 키 는 것 은
[[Prototype]] 속성 이지 만 이것 은 암시 적 속성 이 므 로 스 크 립 트 에 접근 할 수 없습니다.따라서 브 라 우 저 업 체 는 원형 대상 을 명시 적 으로 가리 키 는 속성 __proto__ 을 제공 하지만 ECMA 규범 이 아 닙 니 다.함수 에 주의 하 는 것 은
prototype 속성 입 니 다. 인 스 턴 스 는 __proto__ 속성 입 니 다. 틀 리 지 마 세 요.밤 을 들 어 라. 우 리 는 구조 함수
Person 가 있다.function Person(name) {
this.name = name
} 이때, 우 리 는
Person 의 인 스 턴 스 person 를 만 듭 니 다.var person = new Person(" ") 위의 이론 에 따 르 면 다음 과 같이 표시 할 수 있다.
Person.prototype === person.__proto__ 그들 이 가리 키 는 것 은 모두 원형 대상 이다.
2. 같은 구조 함 수 를 통 해 실례 화 된 여러 개의 실례 대상 은 같은 원형 대상 을 가진다.
var person1 = new Person(" ")
var person2 = new Person(" ") person1.__proto__, person2.__proto__, Person.prototype 그들 은 서로 같다.3. 원형 대상 은 하나의
constructor 속성 이 있 고 이 원형 대상 에 대응 하 는 구조 함 수 를 가리킨다.Person.prototype.constructor === Person
person.__proto__.constructor === Person
4. 실례 대상 자 체 는
constructor 속성 이 없 지만 원형 대상 의 constructor 속성 을 계승 할 수 있다.person1.constructor === Person
person2.constructor === Person
역할.
OK, 원형 이 무엇 인지 분명히 말 하면 이 물건 을 왜 사 용 했 는 지, 왜 구조 함수 에 이런 물건 을 넣 었 는 지 말 해 야 한다.
아니면 구조 함수
Person 를 예 로 들 어 조금 만 고 치 겠 습 니 다.function Person(name) {
this.name = name
this.sayName = function() {
console.log(this.name)
}
}
var person1 = new Person(" ")
var person2 = new Person(" ") 우 리 는 구조 함수
Person 에 하나의 방법 sayName 을 추가 했다. 이렇게 Person 의 사례 person1, person2 는 각각 하나의 sayName 방법 이 있다.주의 하 세 요. 제 가 말 한 것 은 각자 입 니 다. 무슨 뜻 입 니까?인 스 턴 스 를 만 들 때마다 메모리 에
sayName 방법 을 만들어 야 한 다 는 것 이다. 이 sayName 들 은 같은 sayName 이 아니다.person1.sayName === person2.sayName
-> false
여러 개의 실례 가 같은 방법 을 반복 해서 만 드 는 것 은 분명히 자원 을 낭비 하 는 것 이다.이때 우리 의 원형 대상 이 등장 했다.만약 구조 함수 중의 방법 을 우리 가 이렇게 쓴다 면:
function Person(name) {
this.name = name
}
Person.prototype.sayName = function() {
console.log(this.name)
}
var person1 = new Person(" ")
var person2 = new Person(" ")
이전 과 달리 우 리 는 구조 함수 에 쓰 는 것 이 아니 라
sayName 방법 을 구조 함수 의 원형 대상 에 썼 다.여기 서 먼저 개념 을 제시 해 야 한다. 즉, 대상 이 속성 이나 방법 을 찾 을 때 먼저 자신 에 게 서 찾 고 찾 으 면 호출 하 는 것 이다.자신 에 게 서 찾 지 못 하면 그의 원형 대상 을 찾 을 것 이다.이것 이 바로 원형 체인 의 개념 입 니 다. 먼저 여기까지 누 르 면 여러분 이 이 일 을 알 면 됩 니 다.
전에 말 한 것 을 기억 하 십 니까?
같은 구조 함 수 를 통 해 실례 화 된 여러 실례 대상 은 같은 원형 대상 을 가지 고 있다
person1 와 person2 에 서 는 분명히 방법 이 없 지만 그들의 원형 대상 은 있 습 니 다.그래서 여기
sayName 와 person1.sayName 는 실제 적 으로 그의 원형 대상 person2.sayName 을 계승 하 는 방법 이다. 원형 대상 이 같은 것 이 라면 sayName 방법 도 똑 같 을 것 이다. 그래서 이때:person1.sayName === person2.sayName
-> true
공유 해 야 할 방법 과 속성 을 원형 대상 에 놓 고 인 스 턴 스 는 이러한 속성 과 방법 을 호출 할 때 매번 만 들 지 않 아 도 자원 을 절약 하 는 것 이 원형 대상 의 역할 이다.
고민
하지만 공유 인 만큼 문제 가 있 습 니 다. 아니면
sayName 구조 함수 입 니까? 다시 개조 해 보 겠 습 니 다. function Person(name) {
this.name = name
}
Person.prototype.ageList = [12, 16, 18]
var person1 = new Person(" ")
var person2 = new Person(" ") 이때 우 리 는
Person 에서 조작 을 했다.person1.ageList.push(30)
이때
person1 가 무엇 인지 보 세 요.person2.ageList
-> [12, 16, 18, 30]
좀 재미 있어 요.
person2.ageList 에 있 는 person2 도 30 이 많아 졌어 요.그 이 유 는 사실 공유 때문이다.
공유 가 좋 지 않 은 점 은 인 스 턴 스 가 인용 유형 (배열, 대상, 함수) 의 속성 을 수정 하면 원형 대상 의 속성 수정 (사실은 원형 대상 의 속성 을 수정 하고 인 스 턴 스 는 이 속성 이 없 음) 을 초래 하여 모든 인 스 턴 스 에서 이 속성 이 바 뀌 었 습 니 다!
대부분의 경우 우 리 는 공유 하 는 것 을 좋아 하고 자원 을 절약 할 수 있 음 이 분명 하 다.그러나 모든 인 스 턴 스 가 영향 을 받 는 것 을 좋아 하지 않 습 니 다. 아니면 다른 인 스 턴 스 를 만들어 서 무엇 을 합 니까? 하 나 를 사용 하면 되 지 않 겠 습 니까?
따라서 우 리 는 공유 해 야 할 속성 과 방법 을 원형 대상 에 써 야 하고 모든 인 스 턴 스 는 서로 영향 을 주지 않 으 려 는 속성 을 구조 함수 에 써 야 한다.이와 유사 하 다.
function Person(name) {
this.name = name
this.ageList = [12, 16, 18]
}
var person1 = new Person(" ")
var person2 = new Person(" ")
person1.ageList.push(30)
person1.ageList
-> [12, 16, 18, 30]
person2.ageList
-> [12, 16, 18] 이곳 에 구덩이 가 있다
원형 대상 에 대해 서 는 두 개의 구덩이 가 있 으 니 여러분 께 말씀 드 려 야 합 니 다.
1.
function Person(name) {
this.name = name
}
Person.prototype.ageList = [12, 16, 18]
var person1 = new Person(" ")
var person2 = new Person(" ")
person1.ageList.push(30)
person2.ageList
-> [12, 16, 18, 30] 이것 은 문제 가 없 지만 만약 내 가 조작
ageList 을 person1.ageList.push(30) 으로 바 꾸 면 결 과 는 어떻게 될 까?person2.ageList
-> [12, 16, 18]
여기 가 이상 하 다. 모두
person1.ageList = [1, 2, 3] 를 조작 하 는데 왜 다 르 지?그 이 유 는
person1.ageList 할당 작업 이기 때문이다.우 리 는
person1.ageList = [1, 2, 3] 자체 가 person1 속성 이 없 으 며, 할당 작업 은 ageList 자신의 person1 속성 을 증가 시 킬 것 이 라 고 말 했다.자신 이 있 는 이상 원형 대상 을 찾 지 않 아 도 된다.이때 원형 대상 ageList 은 사실 변화 가 없다.그리고 ageList 자신의 person2 속성 이 없 기 때문에 ageList 원형 을 계승 하 는 것 이 바로 person2.ageList 이다.2.
function Person(name) {
this.name = name
}
Person.prototype = {
ageList : [12, 16, 18]
}
var person1 = new Person(" ")
var person2 = new Person(" ")
person1.ageList.push(30)
person2.ageList -> [12, 16, 18, 30] 여 기 는 여전히 문제 가 없 지만 문법 에 변화 가 있다. 우 리 는 더 이상
[12, 16, 18] 의 형식 으로 값 을 부여 하지 않 고 Person.prototype.ageList = [12, 16, 18] 에 대상 을 부여 했다. 대상 중 에는 Person.prototype 이 있다.이렇게 보면 문제 가 없 는 것 같 습 니 다. 사용 해도 똑 같 습 니 다. 변화
ageList, person1.ageList t 도 변 했 습 니 다. 이 는 person2.ageLis 와 person1.ageList 가 같은 원형 대상 에서 계승 되 었 음 을 설명 합 니 다.하지만 여기 문제 가 있 습 니 다. 전에 우리 가 말 했 습 니 다.
실례 대상
자체
person2.ageList 속성 이지 만 원형 대상 을 계승 할 수 있 습 니 다.constructor 속성하지만 이때
person1.constructor === Person
-> false
person2.constructor === Person
-> false
왜 일 까요?
constructor 에 하나의 대상 을 부여 함으로써 원형 대상 의 방향 을 수 정 했 기 때문에 이때 원형 대상 의 Person.prototype 은 내장 구조 함수 constructor 를 가리 키 고 사용 Object 의 형식 으로 값 을 부여 하면 이런 문제 가 발생 하지 않 을 것 이다.따라서 원형 대상 에 게 새로운 대상 을 할당 할 때 원형 대상
Person.prototype.ageList = [12, 16, 18] 을 원래 구조 함수 로 되 돌려 주 는 것 을 기억 하 세 요.Person.prototype.constructor = Person 이상 은 이번 공 유 된 내용 입 니 다. 원형 대상 에 대한 다른 지식 은 다음 편 JS 기초 - 원형 대상 에 대한 이야기 (2) 에서 말씀 드 리 겠 습 니 다.
ps: 수 다스 럽 게 써 서 귀 찮 게 보 실지 모 르 겠 어 요.......................................................
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Thymeleaf 의 일반 양식 제출 과 AJAX 제출텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.