• javascript继承的原理


    通过对javascript的几种函数的运行分析,得出结论:
    javascript 的继承实际上是通过对对象进行初始化来模拟的。
    代码一:实现继承的一种方法
    <script language="javascript" type="text/livescript">
    function Person()
    {
        
    this.say=function(){alert("Name")};
    }

    function PersonA()
    {
        
    this.say=function(){alert("windowSay");};
    }

    PersonA();
    //对window对象添加方法
    window.say();//显示windowSay
    var Me={};
    Person.call(Me);
    Me.say();
    //输出结果为Name,可以得出Me通过Person.call(Me)“继承”了say方法
    </script>
    对比:
    <script language="javascript" type="text/livescript">
    function Person()
    {
        
    }

    Person.say
    =function(){alert("Name")};
    var Me
    ={};
    Person.call(Me);
    //Me.say();//输出object doesn't support this method or property!我们可以看到Me并没有“继承”Person的say方法
    </script>
    为什么呢?
    原因是第一种方法执行Person.call(Me)时,将Person里的this指定为Me,然后执行Person方法里的代码
    显而易见,
    this.say=function(){alert("Name")};这句话对Me添加了方法。让Me对象具有了say的行为。
    而PersonA();时,要执行PersonA里面的代码,此时this对象代表window,所以window获得了say行为。
    而第二种方法执行Person内部的代码,所以并没有给Me添加行为,调用Me.say()自然出错。

    如此看来通过Call,Apply,
    for(property in object),prototype等方法实现继承时,只是一种模拟继承的
    方式。具体过程就是对一个对象动态添加函数,属性。

    Person.call(Me);是对Me添加Person的属性方法,哪么function Person()
    {alert("Name");}面对的对象是谁呢?
    我们通过例子来说明
    <script language="javascript" type="text/livescript">
    window.name
    ="Window";
    function Person()
    {
        alert(
    this.name); 
    }

    window.Person();
    //显示Window
    Person();//显示Window
    </script>
    可见我们定义在script标签里的函数实际上是对window对象的操作,我们给window对象添加了方法和属性

    我们再来看看
    <script language="javascript" type="text/livescript">
    function Person(thing)
    {
        
    this.say=function(){alert(thing);};
    }

    var Me
    ={};
    Person.call(Me,
    "thing");
    Me.say();
    //输出thing 
    window.Me.say();//输出thing
    //window.Person.say("Person");//输出object doesn't support this method or property!
    </script>
    我们可以看到对象Me定义在script标签内,也是window对象的一个变量,同时它又通过call获得了say方法的copy
    而Person作为方法,虽然在其内定义了一个say方法,而Person并没有得到say的copy,要想让Person能say哪么可以
    new Person(),或者Person.call(Person)。new的过程就是将Person内的this设为Person并且添加行为的过程。
    如下:
    <script language="javascript" type="text/livescript">
    function Person(thing)
    {
        
    this.say=function(){alert(thing);};
    }

    var Me
    ={};
    Person.call(Me,
    "thing");
    Me.say();
    //输出thing 
    window.Me.say();//输出thing
    Person.call(Person,"person");
    Person.say();
    //输出person
    window.Person.say();//输出person
    var p=new Person("person");
    p.say();
    //输出person
    window.Person.say("Person");//输出person
    </script>


    原创文章,转载请注明出处!
    All CopyRight Reserved !

    主页:http://jingtao.cnblogs.com

    QQ:307073463
    Email:jingtaodeemail@qq.com
    MSN:sunjingtao@live.com

  • 相关阅读:
    token_get_all()函数
    sql_autoload_register()函数
    微信支付,使用证书时出现58错误
    $GLOBALS['HTTP_RAW_POST_DATA']与$_POST的区别
    mysql锁机制(转载)
    文件锁使用
    单行代码实现xml转换成数组
    Eclipse 安装 SVN 插件的两种方法
    python nltk 安装及配置说明
    HanLP自然语言处理包介绍
  • 原文地址:https://www.cnblogs.com/jingtao/p/1193756.html
Copyright © 2020-2023  润新知