최근에 나는 다른 사람이 쓴 JS 도서관을 보았습니다. 나는 갑자기 JS의 프로토 타입과 상속에 대한 몇 가지 아이디어를 가지고있었습니다. 나는 이전에 그들 중 일부를 보았지만 그다지 명확하지 않습니다. 나는 요즘 여가 시간을 사용 하여이 영역을 이해했지만 여전히 문제가 있다고 생각합니다. 아이디어는 공유를 위해 그렇게 구성되지 않습니다.
1. 인스턴스
JavaScript에는 이진 연산자 인 인스턴스가 있습니다. instancea 인스턴스의 방법을 사용하면 반환 값은 부울입니다. 즉, Instancea가 A의 인스턴스인지 여부를 결정하고 그 본질은 a.prototype === instancea .__ proto__, 예 :
함수 f2 () {var f = function () {} var test = new f (); console.log (f); // true console.log (((f.prototype ==== test .__ proto __)); // true}위의 두 인쇄물 모두 사실입니다. 테스트는 F의 인스턴스임을 나타냅니다. 테스트의 __proto__ 속성은 F의 프로토 타입 객체, 즉 F의 프로토 타입 속성이 객체 이며이 객체는 f의 인스턴스입니다.
2. js의 물체
모든 것이 JS의 대상입니다. 객체는 기능 객체와 일반 객체로 나뉩니다. 일반적인 함수는 실제로 기능 객체입니다
// 함수 객체 var f = function () {} var f2 = new 함수 ( 'str', 'console.log (str)') 함수 f3 () {} // 일반 개체 var o = new Object (); var o2 = {} var o3 = new f ()위에서 볼 수 있듯이 F, F2 및 F3은 기능 객체이고 O, O2 및 O3은 일반적인 객체입니다.
함수 객체와 일반 객체의 차이점 :
새로운 function ()을 사용하여 생성 된 모든 객체 ()는 함수 객체, F 및 F3이며 궁극적으로 새로운 function ()을 사용하여 만들어집니다.
객체를 정의 할 때 객체에는 프로토 타입 및 __proto__와 같은 사전 정의 된 속성이 포함되어 있습니다. 프로토 타입 속성은 기능 객체에서만 사용할 수 있으며 __proto__는 모든 객체에 사용할 수 있습니다. 따라서 객체의 __proto__ 속성에 의해 결정될 수있어 객체가 함수 객체인지 또는 다음과 같은 일반 객체인지를 결정할 수 있습니다.
// 함수 객체 var f = function () {} // 일반 객체 var o = new Object (); console.log (f.prototype); // object {} console.log (o.prototype); // 정의되지 않은위에서, 우리는 함수 객체에 프로토 타입 속성이 있고 일반 객체의 프로토 타입 객체는 정의되지 않음을 찾을 수 있습니다.
3. 프로토 타입 체인
위에서, 우리는 모든 객체에 __proto__ 속성을 가지고 있으며, 이는 그것을 생성 한 기능 객체의 프로토 타입 객체 프로토 타입을 가리 킵니다. 우리는이 체인을 __proto__ 속성을 사용하여 다음과 같은 프로토 타입 체인입니다.
위의 그림은 사람을 예로 들어 보며 프로토 타입 체인을 보여줍니다.
var person = function () {} var person1 = new Person ();1. 사람은 기능 대상이고 Person1은 사람의 사례입니다.
2. person1의 __proto__ 속성은 person.prototype의 프로토 타입 객체입니다.
3. Person의 프로토 타입 객체 인 Person.prototype는 객체이므로 __proto__ 속성이 있으며 객체 프로토 타입 객체를 가리 킵니다.
4. Object의 프로토 타입 객체 객체. 프로로 타입은 객체이며 __proto__ 속성이 있으며이 속성의 프로토 타입 객체는 null입니다.
4. 일부 상속
JS에서는 다음과 같은 기능 객체를 정의합니다.
var person = function () {}위에서 우리는 특성이없고 빈 객체 인 함수 객체를 정의했습니다. 객체이므로 속성을 추가 할 수 있습니다.
var person = function () {} person.name1 = 'js'console.log (person.name1) // js위의 코드는 사람에게 이름 속성을 추가하고 JS에 값을 할당했으며 이름 속성의 값을 인쇄 할 수 있습니다.
그러나 다음과 같이 person1 인스턴스를 만들 때
var person = function () {}; person.name1 = 122; Console.log (person.name1); var person1 = new Person (); console.log (person1.name1); // 정의되지 않은Person1이 Name1 속성이 없다는 것을 알 수 있으므로 개인 인스턴스가 Name1 속성을 갖도록하려면 어떻게해야합니까?
var person = function () {}; person.name1 = 122; // 프로토 타입 객체를 사용하여 객체에 속성을 추가하여 인스턴스 에이 속성이있는 person.prototype.name1 = '12 '; Console.log (person.name1); var person1 = new Person (); Console.log (person1.name1); // 12위의 person.protoype.name1 = '12 '가 사용되므로 모든 인스턴스에 name1 속성이 있습니다. 이러한 방식으로 추가 된 속성은 인스턴스를 생성 할 때 인스턴스의 일반적인 속성으로 간주됩니다.
위의 기사는 JS의 프로토 타입 및 상속을 기반으로합니다. 내가 당신과 공유하는 모든 콘텐츠는 편집자입니다. 나는 그것이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.