原型链的理解

157 阅读1分钟

这个问题关键在于两个点,⼀个是原型对象是什么,另⼀个是原型链是如何形成的

原型对象是什么?

绝大部分的函数(少数内建函数除外)都会有一个prototype的属性,这个属性是原型对象用来创建新对象实例,而所有创建的对象都会共享这一个原型对象,所以这些创建的对象都可以访问到原型对象的属性。

例如 hasOwnProperty() 方法存在于Object原型对象中,它便可以被任何对象当做自己的方法使用

⽤法: object.hasOwnProperty( propertyName )

hasOwnProperty() 函数的返回值为 Boolean 类型。如果对象 object 具有名称为 propertyName 的属性,则返

回 true ,否则返回 false 。

var person = { name: "Messi", age: 29, profession: "football player" }; 
console.log(person.hasOwnProperty("name")); //true 
console.log(person.hasOwnProperty("hasOwnProperty")); //false 
console.log(Object.prototype.hasOwnProperty("hasOwnProperty")); //true

由以上代码可知, hasOwnProperty() 并不存在于 person 对象中,但是 person 依然可以拥有此⽅法.

所以 person 对象是如何找到 Object 对象中的⽅法的呢?靠的是原型链。

原型链是如何形成

原因是每个对象都有 __proto__ 属性,此属性指向该对象的构造函数的原型。

对象可以通过 __proto__ 与上游的构造函数的原型对象连接起来,⽽上游的原型对象也有⼀个 __proto__ ,这样就形成 了原型链。