js 中的原型和原型链
什么是原型?
无论什么时候,只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个 prototype 属性,这个属性指向函数的原型对象。在默认情况下,所有原型对象都会自动获得一个 constructor(构造函数)属性,这个属性包含一个指向prototype 属性所在函数的指针。举例:
1 | const Person = function (name) { |
在上例中,Person.prototype.constructor 指向 Person。而通过这个构造函数,我们还可继续为原型对象添加其他属性和方法。
实例对象与构造函数的关系
1 | const person1 = new Person('小明'); |
上面的 person1 就是实例对象,Person 就被我们叫做 构造函数 。
构造函数的 prototype 属性与它创建的实例对象的[[prototype]]属性指向的是同一个对象,即 实例对象.__proto__ === 构造函数.prototype,所以:
1 | console.log(person1.__proto__ === Person.prototype); // true |
原型链
每个对象都拥有一个隐藏的属性
[[prototype]],指向它的原型对象,这个属性可以通过Object.getPrototypeOf(obj)或obj.__proto__来访问。原型对象同样也有一个隐藏的属性
[[prototype]],指向它的原型对象。通过
__proto__属性将对象和原型连接起来,就组成了原型链。
原型链的作用
当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾。
下面的示例来自 MDN
1 | // 让我们从一个自身拥有属性a和b的函数里创建一个对象o: |
总结
Object是所有对象的爸爸,所有对象都可以通过__proto__找到它Function是所有函数的爸爸,所有函数都可以通过__proto__找到它- 函数的
prototype是一个对象 - 对象的
__proto__属性指向原型,__proto__将对象和原型连接起来组成了原型链 - 对象里找不到的属性会到原型里去找