原型、原型链,是原生js的基础;

 

<script>
/*原型链模式*/
//构造函数模式,虽然解决了实例识别,但是对于一些公用的不能提取出来;如果有一些属性需要公用,就必须用到我们接下来的模式,基于构造函数模式的原型链模式;
//console.dir(oDiv);//这个通过输出结果可以看出原型链,按照原型链来学。
//console.dir(oLis);//可以看输出结果;
/*
function fn(){
var a=12;//私有的变量
console.log(a);//12;
console.log(fn.a);//13;
}
fn.a=13;//私有的属性名
fn();
* */
//js中函数数据类型比较特殊, 他一方面是函数数据类型,一方面是对象数据类型;
/*----------*/
function Fn(){
this.a=12;
this.b=function(){

}
}
Fn.c=function(){};
var f=new Fn();//var f=new fn;不传值的情况下,可以这样写;
var s=new Fn();
//console.log(f.__proto__.c==s.__proto__.c)//结果是true、这个代码写错了,要纠正;
//console.log(f.c== s.c)//下面的是上面的简写;结果都是true
//f.c()//首先在自己的私有中查找,如果有,就是私有的属性,,没有的话就通过__proto__对应类的prototype,如果有的话就是公有的属性,如果原型中也没有呢?则继续根据原型上的__proto__找到基类Object的prototype,如果基类原型也没有,就报错了;-->我们把这一级的查找方式叫原型链;

/*
函数的私有属性是写在函数里面的,公有属性是写在他的prototype上的;
**/


//每一个函数都有自己的属性,prototype和__proto__;有两个属性;
// 每一个对象数据类型(实例也是)都有自己的属性,__proto__;有一个属性;

//函数的中,浏览器默认给浏览器的prototype属性开辟了一个内存地址(对象数据类型,所以有一个天生自带的属性__proto__),在浏览器给开辟的这个地址中,还有一个天生自带的属性constructor;constructor是难点。constructor是构造函数(函数构造器),指向函数本身;

//当我们用构造函数模式创建一个实例的时候,因为它是对象数据类型。所以有一个人天生自带的属性__proto__,这个属性指向他所属类的prototype属性对应的那个内存空间;:
//console.log(Fn.prototype== f.__proto__);//返回true。因为他们指向同一个地址;
//f是Fn是一个实例,那么小f就继承类Fn这个类中的所有的属性,私有的是直接的继承过来(继承构造函数的),公有的是通过__proto__查找的’;

/*--图片导图-*/
//object是所有对象数据类型的基类;
//一个方法hasOwnProperty是定义在Object中prototype指向的那个内存中的;toString也是定在在基类中prototype指向的那个内存;

//在浏览器中有一个最大的内置类Function,所有的函数都是他的实例;所以函数即是函数数据类型,也是对象数据类型;每一个函数中的__proto__指向Function这个类的原型prototype;;

//JS中有两个基类,一个Function和Object;
</script>