이 글에서 공유한 내용은 JS 프로토타입과 프로토타입 체인에 대한 가장 자세한 소개입니다. 필요한 친구가 참고할 수 있습니다.
JS는 객체를 생성합니다(일반이든). 객체 또는 함수 객체), __proto__
라는 내장 속성이 있는데, 이를 생성한 생성자의 프로토타입 객체를 가리키는 데 사용됩니다.
person1 객체에는 __proto__
속성이 있고 이를 생성한 생성자는 Person이고 생성자의 프로토타입 객체는 Person.prototype이므로 person1입니다. __proto__ == Person.prototype
__proto__
的内置属性,用于指向创建它的构造函数的原型对象。
对象 person1 有一个 __proto__
属性,创建它的构造函数是 Person,构造函数的原型对象是 Person.prototype ,所以:person1.__proto__ == Person.prototype
请看下图:
根据上面这个连接图,我们能得到:
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;
这些构造器都是函数对象:
小测试来检验一下你理解的怎么样:
person1.__proto__
是什么?
Person.__proto__
是什么?
Person.prototype.__proto__
是什么?
Object.__proto__
是什么?
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
🎜
🎜
person1.__proto__
가 무엇인가요? 🎜Person.__proto__
그게 뭐죠? 🎜Person.prototype.__proto__
무엇인가요? 🎜Object.__proto__
란 무엇인가요? 🎜Object.prototype__proto__
란 무엇인가요? 🎜person1.__proto__ === constructor.prototype of person1
person1.__proto__ === Person.prototype
🎜🎜두 번째 질문:Person .__proto__ == = 사람의 생성자 .prototype
사람의 생성자 === 함수
Person.__proto__ === 함수 .prototype
🎜🎜 질문 3: Person.prototype
은 일반 개체라는 점만 기억하면 속성에 주의할 필요가 없습니다. Person.prototype.__proto__ === Object.prototype
🎜🎜네 번째 질문은 두 번째 질문을 참조하세요. , Person과 Object는 모두 생성자이기 때문입니다🎜🎜질문 5: Object.prototype
객체에도 proto 속성이 있지만 이는 특별하고 null입니다. null은 프로토타입 체인의 맨 위에 있으므로 기억만 가능합니다. Object.prototype.__proto__ === null
🎜위 내용은 JS 프로토타입과 프로토타입 체인에 대한 가장 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!