(3) [원형 과 대상]
앞부분 이 바다 라면, 자 바스 크 립 트 는 바다의 물이 다.
지금까지 글 을 써 서 이 부분 을 정리 하고 자신의 이 해 를 깊이 있 게 하기 위해 후발 주자 들 이 빨리 구 덩이 를 빠 져 나 갈 수 있 도록 도와 주 고 싶 었 지만 적당 한 착안점 이 부족 해서 독자 들 이 딱딱 한 교과서 가 아니 라 뚜렷 한 경 로 를 볼 수 있 도록 했다.최근 에 '좋 은 문 제 는 요리사 의 칼 과 같 아서 현상 을 쉽게 절개 하여 본질 에 이 르 게 해 줄 수 있다' 는 말 을 보 았 기 때문에 본 고 는 층 층 이 탐문 하고 해답 하 는 방식 으로 이해 하기 쉬 운 각 도 를 제공 하려 고 한다.
현재 의 소프트웨어 개발 은 대상 을 대상 으로 하지 않 는 것 이 매우 드물다. 그러면 자 바스 크 립 트 는 어떻게 대상 을 만 듭 니까?
1. 대상 을 만 드 는 방법
전통 적 인 대상 프로 그래 밍 언어 (예 를 들 어 C + +, 자바 등) 에 서 는 정의 류 의 키워드
class
를 사용 하여 먼저 하나의 종 류 를 설명 한 다음 에 클래스 인 스 턴 스 를 통 해 대상 인 스 턴 스 를 만 듭 니 다.그러나 JavaScript 에서 이러한 논리 적 대상 을 만 들 려 면 대표 적 인 구조 함 수 를 정의 한 다음 new
연산 자 를 통 해 구조 함수 인 스 턴 스 를 실행 하여 대상 을 만들어 야 합 니 다.var object1 = { name: "object1" }
var ClassMethod = function() {
this.name = "Class"
}
var object2 = new ClassMethod()
//
var object3 = new Object({ name: "object3" })
여기 서 언급 한 new
연산 자 는 나중에 상세 하 게 설명 할 것 이다 Object.create(proto)
새로운 대상 을 만 들 고 입 참 proto
대상 을 사용 하여 새로 만 든 대상 __proto__
을 제공 합 니 다. 또한 입 참 대상 이 새로 만 든 대상 의 원형 대상 입 니 다.var Parent = { name: "Parent" }
var object4 = Object.create(Parent)
JavaScript 원형 계승 의 작은 나방 을 알 고 싶 으 면 원형 대상, 사례 대상, 구조 함수 와 원형 체인 의 개념 과 관 계 를 알 아야 합 니 다. 그 다음 에 저 는 표현 하 는 구조 가 뚜렷 하고 간단명료 해 야 합 니 다.
2. 원형 계승
원형 체인 을 잠시 내 버 려 두 고 나 는 먼저 나머지 세 가지 개념의 문 도 를 분명히 말 하 겠 다. 만약 에 네 손 에 종이 와 펜 이 있 으 면 머 릿 속 에서 상상 하지 않 아 도 복잡 하지 않다.
ClassMethod
가 가리 키 는 (3) 인 스 턴 스 대상 (위의 예 에서 object2
에 화살표 가 있 는 선 을 그립 니 다.온라인 표시 new
연산 자, 표시 var object2 = new ClassName()
.prototype
은 이 구조 함수 의 원형 대상 이 ClassName.prototype
과 같다 는 것 을 나타 낸다.(함수 모두 prototype
속성 이 있 고 원형 대상 을 가리 키 고 있 습 니 다) __proto__
은 이 인 스 턴 스 대상 의 원형 대상 이 object2.__proto__
과 같다 는 것 을 나타 내 고 4 단계 와 결합 하면 ClassName.prototype === object2.__proto__
이 있다.constructor
은 이 원형 대상 의 구조 함수 가 ClassName === object2.__proto__.constructor
와 같다 는 것 을 나타 낸다.자 바스 크 립 트 함수 와 대상 이 가지 고 있 는 속성 에 대해 중점 을 두 어야 할 말 이 있 습 니 다. 모든 대상 은 하나의
__proto__
속성 이 원형 대상 을 가리 키 고 모든 함수 가 prototype
속성 이 있 으 며 원형 대상 을 가리 키 고 있 습 니 다.함수 도 사실은 하나의 대상 이다. 그러면 함 수 는 두 개의 원형 대상 이 있다.평소에 대상 이 __proto__
속성 에 따라 가리 키 는 원형 대상 으로 구 성 된 원형 체인 에 더욱 관심 을 가지 기 때문에 함수 의 두 가지 원형 을 구분 하기 위해 __proto__
가 가리 키 는 원형 대상 을 암시 적 원형 이 라 고 부 르 고 prototype
가 가리 키 는 원형 대상 을 디 스 플레이 원형 이 라 고 부른다.여기 서 보면 원형 대상, 사례 대상, 구조 함수 와 원형 체인 이 무엇 인지 이미 알 고 있 을 것 이다. 그러나 왜 이러 는 지 에 대해 서 는 아직 어 리 석 을 것 이다. 왜냐하면 나 도 그 랬 기 때문이다. 예전 의 유형 과 대상, 아버지 류 와 서브 류 의 개념 으로 원형 과 사례 를 대조 하고 익숙 한 관 계 를 찾 아 자신 이 이해 할 수 있 도록 하려 고 한다.
사람들 은 항상 익숙 한 사물 을 통 해 낯 선 사물 을 유추 하여 인식 하 는 습관 이 있다.이것 은 아마도 빠 른 방식 일 것 이다. 그러나 이것 은 결코 효과 적 인 방식 이 아니다.유추 는 항상 우리 로 하여 금 논리 적 추 리 를 경시 하 게 한다
3.
instanceof
에서 원형 체인 을 본다.문법 형식 은
object instanceof constructor
이 고 글자 적 으로 이해 instanceof
하 며 object
구조 함수 인 스 턴 스 화 된 대상 인지 판단 하 는 데 사용 된다.그러나 이 밖 에 구조 함수 가 가리 키 는 디 스 플레이 원형 대상 constructor
이 constructor.prototype
의 원형 체인 에 존재 하면 결 과 는 모두 object
이다.글자 의 이해 가 다소 어 긋 날 수 있 으 니, 제때에 MDN 문 서 를 찾 아 보 세 요.
프로 토 타 입 체인 은 자 바스 크 립 트 관련 대상 간 에
true
속성 이 순서대로 인용 하여 형 성 된 방향 관계 체인 으로 프로 토 타 입 대상 의 속성 과 방법 은 인 스 턴 스 대상 에 의 해 사용 할 수 있다.(이런 지향 적 인 부자 관계 체인 은 계승 을 실현 하 는 특성 을 가진다)연산 자
__proto__
집행 과정 에서 무슨 일이 일 어 났 습 니까?다음 세 단계:
new
의 새로운 대상 을 만 듭 니 다.new Foo()
를 실행 하고 Foo.prototype
지침 을 새로 만 든 대상 에 연결 합 니 다.Foo
연산 자가 실행 한 결과 이다.대상 을 되 돌려 주지 않 으 면 첫 번 째 로 만 든 새 대상 을 사용 합 니 다.직관 적 인 이 해 를 위해 함수
this
를 사용자 정의 하여 연산 자 를 모 의 합 니 다.function myNew(Foo){
var tmp = Object.create(Foo.prototype)
var ret = Foo.call(tmp)
if (typeof ret === 'object') {
return ret
} else {
return tmp
}
}
5. 상속 실현
ES6 에서 더욱 직관 적 인 문법 사탕 형식 이 나 타 났 다.
new
그러나 여기 서 우 리 는 이전에 이런 문법 사탕 이 없 었 던 것 이 어떻게 실현 되 었 는 지 만 볼 수 있다.나 는 줄곧 한 가지 체험 을 해 왔 다.한 가지 사물 을 빨리 이해 하려 면 그 기원 과 변 화 를 알 아야 한다.
우선 부모 클래스 Parent 와 속성 name 을 정의 합 니 다.
function Parent() {
this.name = 'parent'
}
다음은 계승
myNew
의 하위 클래스 new
를 어떻게 정의 합 니까?function Child() {
Parent.call(this)
this.type = 'subClass' // ...
}
이런 방식 의 결함 은 부모 류 원형 체인 의 속성 과 방법 이 하위 류 에 의 해 계승 되 지 않 는 다 는 것 이다.function Child() {
this.type = 'subClass'
}
Child.prototype = new Parent()
은 하위 클래스 가 부모 클래스 의 원형 체인 의 속성 과 방법 을 계승 하지 못 하 는 결함 을 보완 하 는 동시에 새로운 문 제 를 도입 했다. 부모 클래스 의 대상 이나 배열 속성 은 하위 클래스 에 전달 하 는 인 스 턴 스 를 참조 할 것 이다.예 를 들 어 부모 클래스 에 하나의 배열 속성 class Child extends Parent{}
이 있 는데 현재 Parent
인 스 턴 스 를 통 해 두 개의 인 스 턴 스 대상 Child
과 arr
을 화 시 켰 다. 그러면 new Child()
속성 에 대한 조작 은 동시에 c1
의 변 화 를 일 으 킬 수 있다. 이것 은 당연히 우리 가 원 하 는 것 이 아니다.function Child() {
Parent.call(this)
this.type = 'subClass'
}
Child.prototype = new Parent()
은 상기 문 제 를 해결 하 였 으 나 여기 구조 함수 가 두 번 실 행 된 것 을 분명히 보 았 고 약간 여분 이 있 었 다.function Child() {
Parent.call(this)
this.type = 'subClass'
}
Child.prototype = Parent.prototype
은 불필요 한 부모 구조 함수 호출 을 줄 였 으 나 하위 클래스 의 디 스 플레이 원형 은 덮어 씁 니 다.이 예 에서 하위 구조 함 수 를 통 해 하나의 대상 을 예화 할 수 있다. c2
인 스 턴 스 대상 의 원형 대상 을 검증 할 수 있 고 부모 구조 함수 의 디 스 플레이 원형 이다. c1
이런 방식 은 여전히 완벽 하지 않다.function Child() {
Parent.call(this)
this.type = 'subClass'
}
Child.prototype = Object.create(Parent.prototype)
Child.prototype.constructor = Child
인 스 턴 스 대상 의 arr
속성 치 는 항상 이 인 스 턴 스 대상 의 구조 함수 c2.arr
속성 이다.여기 서 구조 함수 의 종속 관계 에 대해 헷 갈 리 기 쉬 운 점 이 존재 합 니 다. 저 는 몇 마디 를 더 해서 이것 을 분명하게 말 하려 고 합 니 다. 위 에 우리 가 그린 삼각형 도 기억 합 니까?세 개의 각 은 구조 함수, 사례 대상 과 원형 대상 을 대표 하고 세 개의 방향 변 은 각각 대표 var cObj = new Child()
, cObj.__proto__.constructor === Parent
, __proto__
가 있 으 며 prototype
에 따라 방향 변 으로 연결 되 는 체인 이 바로 원형 체인 이다.구조 함수 의 종속 관 계 를 명확 하 게 설명 하려 면 우 리 는 먼저 위 에 그 려 진 원형 체인 삼각형 중의 모든 삼각형 에 방향 변 을 추가 해 야 한다. 원형 대상 에서 구조 함 수 를 가리 키 는데 이것 은 원형 대상 이 하나 있다 는 것 을 나타 낸다.
new
속성 은 구조 함 수 를 가리 키 고 이 구조 함수 의__proto__
속성 은 이 구조 함 수 를 가리 키 기 때문에 국부 적 으로 방향 고리 가 형성 되 었 다.지금 은 모든 것 이 조 화 롭 습 니 다. 유독 한 가지 더 있 습 니 다. 바로 원형 체인 말단 의 인 스 턴 스 대상 구조 함수 의 지향 입 니 다.
prototype
연산 자 를 통 해 만 든 인 스 턴 스 대상 __proto__
속성 이 든 모두 원형 대상 constructor
과 같 습 니 다.그래서 일치 성 을 유지 하기 위해 위의 그 문장 prototype
이 있 습 니 다. 한 대상 이 어떤 구조 함수 에서 예화 되 었 는 지 알 고 싶 으 면 new
에 따라 얻 을 수 있 습 니 다.function Child() {
Parent1.call(this)
Parent2.call(this)
}
Child.prototype = Object.create(Parent1.prototype)
Object.assign(Child.prototype, Parent2.prototype)
Child.prototype.constructor = Child
은 Object.create
방법 으로 constructor
원형 상의 방법 을 constructor
원형 으로 복제 했다.이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Thymeleaf 의 일반 양식 제출 과 AJAX 제출텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.