• JS原型探索小记(一)


           最近,我学习了jquery的源码,有个很深的认识就是——当对js的基本语法和面向对象思维了解比较熟悉之后,js真正的精髓在通过阅读一些优秀的框架源码也显现出来,我个人总结为对原型(原型链)和闭包两个基本认识上的大头的全面认识和灵活运用,当然还有在编码路上需要慢慢积累的数据结构、代码技巧、内存管理和事件回调机制经验等方面知识的掌握。

          所以今天写了几行代码试了试原型的脾性,看下面代码:

    function chainOne(){	
    	    	this.name1="zhuxingyu";
    	    	this.age1=20;
    	    }
    
               var a=new chuainOne();//创建实例并执行该函数 
    
               console.log(a.name1); //zhuxingyu
    
          console.log(chainOne.prototype);//Object{}
    	    chainOne.prototype={
    	    	name2:"chenjiajun",
    	    	age2:23,
                    name1:"lujian"
    	    }
    	   
           console.log(chainOne.prototype); //Object{name2:"chenjiajun“,age:23,name1:"lujian"}
           console.log(new chainOne().name2);//chenjiajun
           console.log(new chainOne().name1);//zhuxingyu
    

      

      从上面代码可以看出,用构造函数内部this指向的属性,在fnname.prototype(原型)中为{},属性不可见,但实例对象可访问属性。再通过fnname.prototype=对象,这时fnname.prototype(原型)的值为对象,且实例对象此时,注意是此时可以访问fnname.prototype的属性,我们用对象中的一个属性(与构造函数内属性同名)name1希望来覆盖构造函数中的属性,结果是优先输出构造函数里的属性,覆盖不了。再看下面:

    function chainOne(){	
    	    	this.name1="zhuxingyu";
    	    	this.age1=20;
    	    }
               var a=new chuainOne();//创建实例并执行该函数 
               console.log(a.name1); //zhuxingyu
          console.log(chainOne.prototype);//Object{}
    	    chainOne.prototype={
    	    	name2:"chenjiajun",
    	    	age2:23,
                    name1:"lujian"
    	    }
    	   
           console.log(chainOne.prototype); //Object{name2:"chenjiajun“,age:23,name1:"lujian"}
           console.log(new chainOne().name2);//chenjiajun
           console.log(new chainOne().name1);//zhuxingyu
               function chainTwo(){}
    
               chainTwo.prototype={
                     name3:"yinjun",
                        age3:18
                   }
    
                chainOne.prototype=chainTwo.prototype;
    
                console.log(chainOne.prototype); //Object{name3:"yinjun",age3:18}
    
                console.log(new chainOne().name2);//undifined
    
              console.log(new chainOne().name3);//yinjun
    

      

         上面的代码可以看出,chainOne.prototype(原型)会随着赋给它的对象的不同而其内容会变成相应对象的内容,形式就如同一个普通的变量,但fnname.prototype(原型)会一直拥有构造函数fnname生产的实例对象指向它的指针,同时构造函数内部的属性在new构造时会将属性放在fnname.prototype中(如果是这样,那么这部分属性应该被强制隐藏与保存,并且拥有专权)或者fnname.prototype通过指针指向的内存区域中,所以实例对象可以访问到fnname.proyotype区域和其通过指针指向的区域中的属性。

        

         

  • 相关阅读:
    RAD Studio 11.1 Alexandria Patch 1发布了
    图文解说ChinaCock过场动画的实现
    为FMX项目设置全局日期格式
    Delphi11.1 版本 Android SDK 更新步骤
    有感Delphi官方质量控制平台的使用
    Delphi 在Android32及64位平台如何管理发布文件
    Error reading TAppearanceObjectItem.Appearance.Font.Size:Invalid property path
    CAS AtomicInteger的基本用法
    java中的transient关键字
    后端返回数据,遍历数组,只取对象中某几个属性
  • 原文地址:https://www.cnblogs.com/zhu-xingyu/p/5291108.html
Copyright © 2020-2023  润新知