原型
原型模式是用于创建重复的对象,同时又能保证性能,这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
prototype
存在于 Object、function、class、Function,定义这些对象的时候,会自动生成一个实例对象来表示 prototype,如下
// 下面两句都会分别自动生成一个 A.prototype = new Object();
function A () {} // 自动生成一个 A.prototype = new Object();
class A {} // 自动生成一个 B.prototype = new Object();
// 这里创建实例对象,没有 a.prototype
var a = new A()
proto
指向其构造函数的 prototype,所有对象都有,包括实例对象,(除了Object.prototype), 即谁生产的这个对象,那么此对象的 proto 就指向谁的 prototype。
// 下面两句都会分别自动生成一个 A.prototype = new Object();
function A () {} // A.__proto__ === Function.prototype
class B {} // B.__proto__ === Function.prototype
// 这里创建实例对象,没有 a.prototype,但有 a.__proto__
var a = new A() // a.__proto__ === A.prototype
由于 prototype 也是一个实例对象,因此它也有 proto
function A () {}
var a = new A()
// a.__proto__ === A.prototype
// A.prototype.__proto__ === Object.prototype
// Object.prototype.__proto__ === null
总结
prototype 一般存在于 Object、function、class、Function 这些对象,定义这些对象的时候,会自动为我们创建一个实例对象用作原型 prototype,prototype 上面可以定义一些属性和方法。
通过 new 创建的一些常见对象通过 proto 来关联上其构造函数的 prototype 引用,从而方便在继承时能得到 prototype 引用并且拿到其绑定的属性和方法。
获取对象的属性或者方法时,先在实例本身寻找,若没有,则去__proto__上寻找,这时 proto 就起到了桥梁作用指向其构造函数的 prototype,然后依次继续寻找 prototype.proto, 直到 Object.prototype.__proto__为止。