关于这个知识点的网上的博客帖子已经很多很多了,无意与大牛们比,只是想着自己理解了表达提炼出来,作为整理,方便记录。
全面的理解一遍
1️⃣ JavaScript是面向对象的语言。面向对象的语言都是通过类来创建实例对象,但是ES6之之前没有class。
2️⃣ JavaScript通过构造函数生成实例化对象。
function Car(){
//code
}
var suv = new Car();
3️⃣ 每个函数都有一个prototype
属性,本质是对象。
//可以访问prototype
console.log(Car.prototype);
4️⃣ 每个实例对象都有一个私有属性[[Prototype]]
,指向这个实例对象的原型.
可以用ES6的Object.getPrototypeOf()
来访问该属性。
Object.getPrototypeOf(实例)
等于 实例.__proto__
5️⃣ 构造函数的prototype指向该构造函数创建的实例对象的原型(__proto__
)。
6️⃣ 每个原型对象的constructor
属性都指向构造函数。
7️⃣ 原型链就是原型上一层一层的结构关系(原型往上查找的过程)。
如果想访问某个属性:
①在实例对象suv内部找
②在对象原型(suv.__proto__
/ Car.prototype
)找
③在对象原型的原型(Car.prototype.__proto__
)找
④…
这就是原型链。
8️⃣ 原型链的顶端是Object.prototype
(所有JavaScript对象都是基于Object)
9️⃣ JavaScript的继承是基于原型链。在原型链上任何位置设置属性,都能被访问到。
🔟 我们其实已经在不经意间使用了原型链,我们新建的数组都是继承的Array.prototype
,才有各种方法可以直接使用;函数也是来自于Function.prototype
总结版的回答
-
JS对象在创建时就会关联一个对象,这个对象就是原型。
-
每一个对象都会从原型上继承属性。
-
原型也是对象,原型也有原型对象,层层往上,直到
Object.prototype
,这就是原型链。