머리말
SegmentFault에서 이와 같은 질문을 보았습니다.
var f = function () {}; object.prototype.a = function () {}; function.prototype.b = function () {}; var f = new f ();Q : f A와 B를 얻을 수 있습니까? 원칙은 무엇입니까?
언뜻보기에 나는 정말로 혼란 스러웠다. 주의 깊은 연구를 거친 후에도 프로토 타입을 철저히 이해하지 못한다는 것을 알았으므로 요약하고 구멍을 채웠습니다 ~
기능과 객체
문제를 해결하기 전에 프로토 타입, 프로토 타입 체인 및 기능과 객체의 관계에 대해 이야기 해 봅시다.
원기
함수를 만들 때 프로토 타입 객체가 자동으로 작성되며 기능의 프로토 타입 속성을 통해 액세스 할 수 있습니다.
생성자의 인스턴스 객체를 작성하여 생성자의 프로토 타입 개체를 가리키는 포인터 (내부 특성)가 포함됩니다. ECMA-262이 포인터의 5 번째 판은 [[프로토 타입]]이라고합니다. 스크립트에서 [[프로토 타입]]에 액세스하는 표준 방법은 없지만 Firefox, Safari 및 Chrome은 각 객체의 속성 __proto__를 지원하여 생성자의 프로토 타입 개체에 액세스합니다.
다시 중요한 말을하겠습니다.
생성자는 프로토 타입 속성을 통해 프로토 타입 객체에 액세스합니다.
인스턴스 객체는 [[프로토 타입]] 내부 속성을 통해 프로토 타입 객체에 액세스하고 브라우저는 인스턴스 개체가 프로토 타입 객체에 액세스 할 수 있도록 _proto_ 속성을 구현합니다.
var f = function () {}; var f = new f (); // f의 프로토 타입 객체가 p라고 가정합니다.다시 반복하십시오. . 프로토 타입은 생성자와 프로토 타입 객체 사이의 관계를 나타냅니다. __proto__는 인스턴스 객체와 프로토 타입 객체 간의 관계를 나타냅니다.
프로토 타입 체인
클래스 A는 B, B 상속을 상속합니다. 실제로, A의 프로토 타입 객체에서 포인터를 가리키는 프로토 타입 객체와 프로토 타입 객체에서 C를 포인터로 가리키는 프로토 타입 객체가 있습니다 ... 프로토 타입 객체 간의 연결입니다. ABC의 세 가지 생성자 사이에는 관계가 없으므로 "프로토 타입 체인"이라고합니다.
A가 A의 인스턴스 객체라고 가정하면 A의 프로토 타입 체인은 아래 그림의 자주색 선에 표시되며 오렌지 라인은 생성자와 프로토 타입 객체를 연결합니다.
그림에서 볼 수 있듯이 프로토 타입 체인의 끝은 Object.Prototype .__ proto_, 즉 NULL입니다. A의 속성이나 방법을 찾을 때 먼저 A 자체가 있는지 여부를 찾으십시오. 그렇지 않은 경우 프로토 타입 체인을 따라 검색하여 NULL 이후에 정의되지 않은 상태로 돌아올 때까지 검색하십시오.
기능과 객체
기능과 객체의 관계는 약간 엉키 었습니다.
물체는 생성자입니다. 함수이므로 함수의 인스턴스 객체입니다. 함수는 생성자이지만 기능은 물체입니다. 객체이므로 객체의 인스턴스 객체입니다.
모든 객체는 객체의 인스턴스이며 모든 함수는 기능의 인스턴스입니다.
객체는 함수의 인스턴스이고 함수. 프로로 타입은 물체의 인스턴스입니다.
둘 사이의 관계는 아래 그림에 나와 있습니다.
볼 수 있듯이, 물체는 생성자로서, 프로토 타입 속성이 Object.Prototype을 가리키고 있으며 인스턴스 객체로서 객체 .__ proto_는 function.prototype을 가리키는 것을 갖는다. 함수는 생성자이며 기능을 가리키는 프로토 타입 속성을 가지고 있으며 기능은 함수이기도하며 함수의 인스턴스이기도하므로 기능이 있습니다.
그림과 같이 크롬 콘솔에서 확인할 수 있습니다.
원래 질문 분석
프로토 타입 체인의 문제를 해결하는 가장 좋은 방법은 그림을 그리는 것입니다. 이전 분석 후이 사진은 다음과 같이 문제가되지 않아야합니다 ~
F의 프로토 타입 체인은 파란색 선으로 그려 지므로 F는 A에 액세스 할 수 있지만 B는 액세스 할 수 없습니다.
그림을 그리지 않으면 언뜻보기에 f가 접근 할 수 있다고 생각할 수 있습니다. b. f. prototype가 함수를 가리키는 것은 나와 같을 수 있지만 실제로 F. prototype은 함수가 아닌 객체이므로 프로토 타입 객체가 함수가 아닙니다.
따라서 프로토 타입 체인 문제가있을 때마다 ~ ~
확장 된 주제
위의 질문에서 F는 A에만 액세스 할 수는 있지만 b. 그러나 F는 A와 B 모두에 액세스 할 수 있습니다. 질문을 다음에 수정하면 fb ()의 결과는 무엇입니까? 왜? 당신은 그것에 대해 생각할 수 있습니다 ~
var f = function () {}; object.prototype.a = function () {}; function.prototype.b = function () {console.log ( 'f .__ proto__')}; f.prototype.b = function () {console.log ( 'f.prototype');};요약
이 글을 읽은 후 기능의 특별한 기능을 찾았습니까?
일반적인 객체의 경우 생성자의 프로토 타입 객체에 액세스하는 데 사용되는 __proto__ 속성이 하나 뿐이며 함수의 경우 기능과 객체입니다.
함수로서, 프로토 타입 객체 함수 이름을 가리키는 프로토 타입 속성으로 태어납니다.
함수의 인스턴스 객체로서, __proto__ 속성이 function.prototype을 가리키고 있습니다.
일반적 으로이 두 특성은 두 개의 객체를 가리 킵니다. 그러나 함수의 특성은 모두 동일하게 함수를 가리 킵니다. 프로로 타입.
함수 a ()의 경우, A. prototype의 방법은 인스턴스 객체로 호출되며 그 자체로 사용되지 않습니다. a가 인스턴스로 실행되면 .__ proto__의 메소드가 호출됩니다. 다시 말해, 생성자로서 사용될 때, A. prototype 사슬을 취하고, 방법과 속성이 그들의 예제에 할당된다; 물체로 사용하면 a .__ proto__ 체인이 가져옵니다. 다른 시나리오에서는 정체성을 구별하는 것은 잘못이 아닙니다.
전체 기사 후에, 나는 내가 말한 것이 상당히 잔소리라고 생각합니다 ... 단점이 있다면 저를 바로 잡으십시오. .
이 기사가 읽은 후 약간의 이익을 가져 오기를 바랍니다 ~ ^_ ^
이 웹 사이트를 지원 해주셔서 감사합니다. 우리는 미래에 관련 정보를 계속 업데이트하여 지식 의이 부분을 배우고 이해하도록 도와 줄 것입니다!