原型模式

125 阅读1分钟

接触JS一年多,总是混淆它们之间的关系,这次偶然看到一篇博客,写得简略但是思路很清晰,结合自己在红宝书上看到的内容,故作此记录。
若有不当,请多多指教。

欲解决问题:定义在构造函数外部的全局函数只能被某个对象调用,这让全局函数 有点名不副实。

问题来了:如果对象需要定义很多的方法,那么就需要定义很多的全局函数,这样的话,这个自定义的引用类型就没有 封装性 可言了。
所以,可以用 原型模式 来解决此问题。

prototype 本义:原型;雏形;最初形态
在这里插入图片描述

在这里插入图片描述

代码展示如下所示

function Person() {

}

var person = new Person();

console.log(person.__proto__ == Person.prototype) // true
console.log(Person.prototype.constructor == Person) // true
// 顺便学习一个ES5的方法,可以获得对象的原型
console.log(Object.getPrototypeOf(person) === Person.prototype) // true

实例与原型

当读取实例的属性时,如果找不到,就会查找与对象关联的原型中的属性,如果还查不到,就去找原型的原型,一直找到最顶层为止。

原型的原型
实例的 proto 指向构造函数的 prototype ,

原型链

那 Object.prototype 的原型呢?

null,我们可以打印:

console.log(Object.prototype.__proto__ === null) // true
null 表示“没有对象”,即该处不应该有值。

所以 Object.prototype.proto 的值为 null 跟 Object.prototype 没有原型,其实表达了一个意思。

所以查找属性的时候查到 Object.prototype 就可以停止查找了。