js高级 原型对象 显性原型对象与隐性原型对象 原型链

原型对象,是用来解决构造函数在创建实例的时候,防止重复执行所导致的性能的降低(这里主要指占用内存),来为服用带来方便

如果在构造函数上添加一个方法 当你每次调用这个构造函数的时候都会调用里面的方法如果用原型对象的话就不用反复调用

每个函数都有一个prototype属性,他默认指向一个object空对象(实例)原型对象

<script>
    function fun(age) {
        //添加一个name属性让name属性等于传过来的name参数
         this.age = age
    }
   const a= new fun()
   console.log(fun.prototype);
</script>

js高级 原型对象 显性原型对象与隐性原型对象 原型链

显性原型对象与隐性原型对象

prototype这个是显性原型对象 __proto__是隐性原型对象

注意 构造函数上有 prototype和__proto__属性而他的实例上没有prototype属性只有__proto__这个属性

   function fun(age) {
        //添加一个name属性让name属性等于传过来的name参数
         this.age = age
    }
   const a= new fun()
   console.log(fun.prototype);
   console.log(fun.__proto__);
   console.log(a.prototype);
   console.log(a.__proto__);

js高级 原型对象 显性原型对象与隐性原型对象 原型链
而且他的实例上的__proto__和他的构造函数上的prototype是一样的

***其实当你调用某些方法比如像onclick事件就是它定义好的事件都是在原型上定义的 ***

原型链

看一段代码

<script>
 function fun(){
     this.test1=function(){
         console.log("test1");
     }
 }
 fun.prototype.test2=function(){
     console.log("text2");
 }
 const a=new fun()
 a.test1()
 a.test2()
 a.toString()
 a.test3()
</script>

js高级 原型对象 显性原型对象与隐性原型对象 原型链
这里test和test2都能找到因为他们一个添加到构造函数上一个添加到了原型对象上
那为什么没有定义tostring和test3,tostring没报错test3确报错了因为tostring在原型链上

原型链理解
js高级 原型对象 显性原型对象与隐性原型对象 原型链
当要找一个方法时他会先在这个构造函数上面找,如果找不到就会去他的原型对象上面找如果还找不到他就回去object空实例对象(其实是实例对象的__proto__,实例的__proto__===构造函数的prototype,prototype指向objeect)上面找
js高级 原型对象 显性原型对象与隐性原型对象 原型链
这个空object空实例对象指向一个object原型对象 就相当于 object.prototype(每个函数都有prototype)它里面还有很多方法tostring就是一个如果 object.prototype再找不到就会接着去__proto__上面找而object的原型对象的__proto__是null所以就找不到test3

上一篇:Jetpack架构组件学习(1)——LifeCycle的使用


下一篇:PTA天体赛 L1-071 前世档案 (20 分) 详解