基于构造函数的原型模式,解决了方法或者属性公有的问题->把实例之间相同的属性和方法提取成公有的属性和方法。
三个重要知识点.
1、每一个函数数据类型(普通函数,类),都有一个天生自带的属性prototype(原型),并且这个属性是一个对象数据类型的值。
2、在prototype上,浏览器天生给它加了一个属性constructor(构造函数),属性值是当前函数(类)本身。
3、每一个对象类型(普通的对象、实例、prototype...)也天生带一个属性:__proto__,属性值是当前实例所属类的原型(prototype)
原型链模式
f1 instance of Object ->true 因为f1通过__proto__可以向上级查找,不管有多少级最后总能找到Object.
在Object.prototype上没有__proto__这个属性
f1.hasOwnProperty("x") //hasOwnProperty是f1的一个属性
但是我们发现在f1的私有属性上并没有这个方法,那如何处理的呢?
1、通过.对象名的方式获取属性值的时候,首先在对象的私有属性上进行查找,如果私有中存在这个属性,则获取的是私有属性的值。
如果私有的没有,则通过__proto__找到所属类型的原型(类的原型上定义的属性和方法都是当前实例共有的属性和方法),原型上存在的话,获取的是圆形上的属性值。
如果原型上也没有,怎继续通过原型上的__proto__继续向上查找,一直找到Object.Prototype为止,这种查找机制就是我们的原型链模式
某个方法中的this->看执行的时候“.”前面是谁this就是谁
1)需要确定this的指向(this是谁)
2)把this替换成对应的代码
3)按照原型链查找的机制,一步步的查找结果
“原型继承”是JS中最常见的一种继承方式,子类B想要继承父类A的所有属性和方法(私有+共有),只需要让B.prototype=new A 即可.
原型继承的特点:它是把父类私有的+共有的都继承到了子类原型上(子类共有的)。
核心:原型继承并不是把父类中的属性和方法克隆一份一模一样的给B,而是让B和A之间增加了原型链的链接,以后B的实例n想要A中的getX方法,
需要一级级的向上查找使用