zoukankan      html  css  js  c++  java
  • prototype认知

    关于javascript中的类、对象,各有各的说法,书上一笔带过,网上看了一些,互相打架,还是自己试试,代码如下:

             function xurui() { };
            alert(xurui.constructor);//fFn
            alert(xurui.prototype);//oo
            alert(xurui.constructor.prototype);//fn
            alert(xurui.constructor.prototype.constructor);//fFn
            alert(typeof(xurui.constructor.prototype));//function
            alert('mark');
            alert(Function);//fFn
            alert(Function.prototype);//fn
            alert(Function.constructor);//fFn
            alert('mark again');
            alert(Object);//function Object(){[native code]}
            alert(Object.constructor);//fFn
            alert(Object.prototype);//oo
            alert('end mark');
            alert(xurui.constructor.constructor);//fFn
            alert(xurui.prototype.constructor);//fx
            alert(typeof(xurui));//function
            alert(typeof(xurui.constructor));//function
            //alert(typeof(function));//报错
            var xml = new xurui();
            alert(xml.constructor);//fx
            alert(xml.constructor.prototype);//oo
            alert(xml.constructor.constructor);//fFn
            function xushun(){ this.getmessage=function(){alert('thismessagemark');} };
            xushun.prototype=new xurui();
            var xiaogou=new xushun();
            alert(xiaogou.constructor);//fx
            alert(xiaogou.constructor.prototype);//oo
            alert(xiaogou.constructor.constructor);//fFn
            alert(xushun.constructor);//fFn
            function ghost(){};
            ghost.prototype=new xushun();
            alert(ghost.prototype);//oo
            alert(ghost.prototype.constructor);//fx
            ghost.prototype.getmessage();//thismessagemark
            alert(ghost.constructor);//fFn
            var mao=new ghost();
            alert(mao.constructor);//fx
            alert(eval(mao.constructor).prototype.constructor);//fx
            alert(mao);//oo
            alert(typeof(ghost.prototype));//object
            alert(typeof(ghost));//function
            alert(typeof(mao));//object
            alert(mao.prototype);//undefined
            mao.getmessage();//thismessagemark   

    注释后面是结果

    fn=function(){[native code]}

    oo=object Object

    fx=function xurui(){}

    fFn=function Function(){[native code]}

    =================

    基本判断如下:

    1. 类本身也是对象。function(){[native code]}是原初对象,function派生出Function对象,Function本身又是原初类,其实例化生成其他各种function类,首先生成第一个function类Object,作为所有其他类的prototype,随后基于object Object和Function生成各种function祖先类。

    2.对象派生自object Object,派生在此过程中相当于改造,object,function是对象的两种状态。object Object本质为function Object(){[native code]}同时兼具两个状态,也是最后一个同时兼具两个属性的对象,此后则是function和object两个系统不断交互的过程。实例化对象,即是把类里新加的属性转移到object Object中去,派生类,则是以父类的对象(某个object Object的修正版)为prototype属性改造Function对象的过程。

    所有对象的constructor皆为祖先类。因为对象本身无contructor属性,其contructor来自类的原型(prototype),原型也是对象,故追朔原型的类的原型,以此类推,直至祖先类的原型的constructor即是祖先类本身。

    3.类有prototype而对象没有,这个问题如果把类和对象看做不同的对象就迎刃而解了。类在实例化的过程中,其Prototype对象的属性和函数被原封不动的转移到子类对象中,如此实现javascript的继承机制,说老实话,这是一种相当继承的一种简陋和直接的实现,你在子类中无法运行时追朔到父类,子类的对象仅仅是拥有父类的全部属性而已,一切的对象本质是object Object,而Object的本质是function,所以到这里可以推论得出,对象也是类,进一步得出,javascript并无类与对象的分别,只有图纸对象function与修改对象object两种,修改对象本质上也是图纸对象,new的本质是用function对象作为图纸生成一个object Object对象。本质上说function意思是准备加,object意思是已经加进去了。

    以下是理解流程图:

  • 相关阅读:
    Maven常用命令
    SpringBoot实战(十三)之缓存
    python3对数据库的基本操作
    Microsoft visual c++ 14.0 is required问题
    python3之安装mysql问题
    如何将pip更新到最新版
    Java特性之继承的应用
    人人开源之代码生成器(renren-generator)
    《你凭什么做好互联网》之思维导图归纳
    GETOBJECTOPTIONS
  • 原文地址:https://www.cnblogs.com/shatongtian/p/2913725.html
Copyright © 2011-2022 走看看