• 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意思是已经加进去了。

    以下是理解流程图:

  • 相关阅读:
    WCF寻址
    WCF之多个协定
    WCF之多个终结点
    WCF客户端和服务端配置
    VS2012新建项目出错:未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService
    windows运行打开服务命令
    Android中 服务里的方法抽取成接口
    Android Studio 使用genymotion 模拟器运行app时 提示找不到任何设备
    SVN 首次用TortoiseSVN Checkout 提示Unexpected HTTP status 405
    jQuery EasyUI -onblu、onkeyup等事件
  • 原文地址:https://www.cnblogs.com/shatongtian/p/2913725.html
Copyright © 2020-2023  润新知