>  기사  >  웹 프론트엔드  >  JS 프로토타입과 프로토타입 체인에 대한 가장 자세한 소개

JS 프로토타입과 프로토타입 체인에 대한 가장 자세한 소개

零到壹度
零到壹度원래의
2018-04-13 16:47:461606검색

이 글에서 공유한 내용은 JS 프로토타입과 프로토타입 체인에 대한 가장 자세한 소개입니다. 필요한 친구가 참고할 수 있습니다.

1. __proto__

JS는 객체를 생성합니다(일반이든). 객체 또는 함수 객체), __proto__라는 내장 속성이 있는데, 이를 생성한 생성자의 프로토타입 객체를 가리키는 데 사용됩니다.
person1 객체에는 __proto__ 속성이 있고 이를 생성한 생성자는 Person이고 생성자의 프로토타입 객체는 Person.prototype이므로
person1입니다. __proto__ == Person.prototype__proto__ 的内置属性,用于指向创建它的构造函数的原型对象。
对象 person1 有一个 __proto__属性,创建它的构造函数是 Person,构造函数的原型对象是 Person.prototype ,所以:
person1.__proto__ == Person.prototype

请看下图:

《JavaScript 高级程序设计》的图 6-1

根据上面这个连接图,我们能得到:

Person.prototype.constructor == Person;
person1.__proto__ == Person.prototype;
person1.constructor == Person;

不过,要明确的真正重要的一点就是,这个连接存在于实例(person1)与构造函数(Person)的原型对象(Person.prototype)之间,而不是存在于实例(person1)与构造函数(Person)之间。

注意:因为绝大部分浏览器都支持__proto__属性,所以它才被加入了 ES6 里(ES5 部分浏览器也支持,但还不是标准)。

二. 构造器

熟悉 Javascript 的童鞋都知道,我们可以这样创建一个对象:

var obj = {}

它等同于下面这样:

var obj = new Object()

obj 是构造函数(Object)的一个实例。所以:

obj.constructor === Object
obj.__proto__ === Object.prototype

新对象 obj 是使用 new 操作符后跟一个构造函数来创建的。构造函数(Object)本身就是一个函数(就是上面说的函数对象),它和上面的构造函数 Person 差不多。只不过该函数是出于创建新对象的目的而定义的。所以不要被 Object 吓倒。


同理,可以创建对象的构造器不仅仅有 Object,也可以是 Array,Date,Function等。
所以我们也可以构造函数来创建 Array、 Date、Function

var b = new Array();
b.constructor === Array;
b.__proto__ === Array.prototype;var c = new Date(); 
c.constructor === Date;
c.__proto__ === Date.prototype;var d = new Function();
d.constructor === Function;
d.__proto__ === Function.prototype;

这些构造器都是函数对象:

函数对象

三.  原型链

小测试来检验一下你理解的怎么样:

  1. person1.__proto__ 是什么?

  2. Person.__proto__ 是什么?

  3. Person.prototype.__proto__ 是什么?

  4. Object.__proto__ 是什么?

  5. Object.prototype__proto__ 是什么?

答案:
第一题:
因为 person1.__proto__ === person1 的构造函数.prototype
因为 person1的构造函数 === Person
所以 person1.__proto__ === Person.prototype

第二题:
因为 Person.__proto__ === Person的构造函数.prototype
因为 Person的构造函数 === Function
所以 Person.__proto__ === Function.prototype

第三题:
Person.prototype 是一个普通对象,我们无需关注它有哪些属性,只要记住它是一个普通对象。
因为一个普通对象的构造函数 === Object
所以 Person.prototype.__proto__ === Object.prototype

第四题,参照第二题,因为 Person 和 Object 一样都是构造函数

第五题:
Object.prototype 对象也有proto属性,但它比较特殊,为 null 。因为 null 处于原型链的顶端,这个只能记住。
Object.prototype.__proto__ === null

아래 그림을 참조하세요: 🎜

🎜

"JavaScript 고급 프로그래밍"의 그림 6-1🎜🎜위 연결 다이어그램에 따르면 다음을 얻을 수 있습니다. 🎜rrreee🎜그러나 명확히 해야 할 정말 중요한 점은 인스턴스(person1)와 프로토타입 객체(Person.prototype) 사이에 이러한 연결이 존재한다는 것입니다. , 인스턴스(person1)와 생성자(Person) 사이가 아닌 🎜🎜참고: 대부분의 브라우저는 __proto__ 속성을 지원하기 때문에 ES6에 추가되었습니다(일부 ES5 브라우저도 이를 지원하지만 아직 표준은 아닙니다). 🎜🎜2. 생성자🎜🎜Javascript에 익숙한 사람이라면 누구나 다음과 같은 객체를 생성할 수 있다는 것을 알고 있습니다.
🎜rrreee🎜다음과 동일합니다.
🎜rrreee🎜obj는 생성자입니다(객체 ) 인스턴스. 그래서:
🎜rrreee🎜새 객체 obj는 new 연산자 뒤에 생성자를 사용하여 생성됩니다. 생성자(Object) 자체는 위의 생성자 Person과 유사한 함수(위에서 언급한 함수 객체)입니다. 단지 이 함수는 새로운 객체를 생성하기 위한 목적으로 정의되었을 뿐입니다. 그러니 객체에 겁먹지 마세요. 🎜


🎜마찬가지로 객체를 생성할 수 있는 생성자는 Object 뿐만 아니라 Array, Date, Function 등도 있습니다.
따라서 생성자를 사용하여 배열, 날짜 및 함수를 생성할 수도 있습니다🎜rrreee🎜이 생성자는 함수 객체입니다:🎜

🎜

함수 객체🎜🎜3. 프로토타입 체인🎜🎜소규모 테스트 예정 확인 이해: 🎜

  1. 🎜person1.__proto__가 무엇인가요? 🎜
  2. 🎜Person.__proto__ 그게 뭐죠? 🎜
  3. 🎜Person.prototype.__proto__ 무엇인가요? 🎜
  4. 🎜Object.__proto__란 무엇인가요? 🎜
  5. 🎜Object.prototype__proto__란 무엇인가요? 🎜
🎜답변:
첫 번째 질문:
Becauseperson1.__proto__ === constructor.prototype of person1
Because person1의 생성자 === Person
그래서 person1.__proto__ === Person.prototype🎜🎜두 번째 질문:
BecausePerson .__proto__ == = 사람의 생성자 .prototype
사람의 생성자 === 함수
그래서 Person.__proto__ === 함수 .prototype🎜🎜 질문 3:
Person.prototype은 일반 개체라는 점만 기억하면 속성에 주의할 필요가 없습니다.
일반 객체의 생성자 === Object
그래서 Person.prototype.__proto__ === Object.prototype🎜🎜네 번째 질문은 두 번째 질문을 참조하세요. , Person과 Object는 모두 생성자이기 때문입니다🎜🎜질문 5:
Object.prototype 객체에도 proto 속성이 있지만 이는 특별하고 null입니다. null은 프로토타입 체인의 맨 위에 있으므로 기억만 가능합니다.
Object.prototype.__proto__ === null🎜

위 내용은 JS 프로토타입과 프로토타입 체인에 대한 가장 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.