原型
<h3>原型的定义</h3>
<p>1.所有的函数都天生自带一个属性:</p>
<ul>
<li>prototype(原型),它是一个对象数据类型的
值,在当前prototype对象中,储存了类需要
给其实例使用的公有的属性和方法。</li>
</ul>
<p>2.prototype这个对象,浏览器会默认为其开
一个堆内存,在这个堆内存当中天生自带一个
属性:constructor(构造函数),这个是属性
储存的值就是当前函数本身</p>
<p>3.每一个类的实例(每一个对象)都天生自带
一个属性:<em>proto</em>,属性值是当前对象所属类
的原型(prototype)</p>
<pre><code class="language-javascript">function Fn(name,age){
this.name = name
this.age = age;
this.say = function(){
console.log('my name is'+this.name+'iam+'this.age'+)
}
}
Fn.prototype.say = function(){
console.log('Hello Word')
}
Fn.prototype.eat = function(){
console.log('I love food')
}
var f1 = new Fn('judy',19);
var f2 = new Fn('Wayne',88);</code></pre>
<h3>原型继承</h3>
<blockquote>
<p>定义:让子类的原型指向父类的实例
children.prototype = new Parent();
[细节]</p>
<ol>
<li>我们首先让子类的原型指向feii的实例,然后在向子类原型扩展方法,防止提前增加方法,等原型重新指向后,之前在子类原型上扩展的方法都没有了(子类原型已指向新的空间地址了)
2.让子类原型重新指向匪类原型实例,子类原型上原有的constructor就没有了,为了保证构造函数的完整性,我们最好给子类原型重新手动设置constructor属性的值:Children.prototype.constructor = Children;</li>
</ol>
<p>[原理]
原型继承,并不是把父类的属性和方法copy一份给子类,而是让子类的原型和父类原型之间搭建一座桥梁,以后子类(或者子类的实例可以通过原型链的查找机制,找到弗雷原型上的方法,从而调取这些方法使用即可)</p>
<p>[特征]
子类不仅可以继承父类原型上的公有属性和方法,而且<strong>父类提供对给实例的那些私有的属性方法</strong>,也被子类继承了(存放在子类原型上,作为子类公有的属性和方法)</p>
</blockquote>
<pre><code>function Parent() {
this.x = 100;
}
Parent.prototype.getX = function () {
console.log(this.x);
};
function Children() {
this.y = 200;
}
Children.prototype = new Parent();//=>最好在扩展子类原型方法之前完成
Children.prototype.constructor = Children;
Children.prototype.getY = function () {
console.log(this.y);
};
var child = new Children();</code></pre>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/e7a71e0cf0654f2034d57f7c3252e408?showdoc=.jpg" alt="" /></p>