js 是解释型语言2个不可执行的 this.Show();  语句在执行时,show方法还未定义

解决方案 »

  1.   


    <script> 
    // 三个功能相同的类,是工作中遇到的问题的总结 
    // 标注不可执行的那些代码是为什么? 
    // 请给我一个相对底层的讲解 谢谢 
    // obj.Show()可执行 
    var TestClass = function(name) 

        this.name = name; 
        this.Show();//可执行 
    }
    TestClass.prototype = { //这里重新设置了TestClass的原型
    /*
    当执行new TestClass时。
    会调用Object构造来把TestClass实例化
    然后把TestClass原型下所有的属性的引用copy给TestClass
    这个操作在执行TestClass这个构造函数前已经执行完毕
    比如
    var wc = new TestClass
    wc就具有了Show这个方法,并且指向TestClass.prototype.Show
    这时,你从构造里就可以用this.Show来访问到这个方法
    如果你修改了
    this.Show
    比如
    this.Show = function () {};
    这时
    wc.Show这个方法的引用就会指向你新修改的那个函数上即function () {};
    这样它就和TestClass.prototype.Show没有关联了。
    若你还想通过wc.Show来访问TestClass.prototype.Show
    把你新加的wc.Show方法删除掉就可以了
    delete wc.Show
    这样在调用
    wc.Show就又是TestClass.prototype.Show了。
    至于下面的操作,是从构造里来改变原型。虽然这样写也会把wc所继承。
    不过,它的执行顺序就不同了(初始化的顺序即调用时,还未初始化)
    第三种的话。
    它直接改变了原型的引用
    这样的话。
    只能在下次new TestClass时,才会生效
    */
        Show:function() 
        { 
            alert(this.name); 
        } 
    }
    /* 
    // obj.Show()可执行 
    var TestClass = function(name) 

        this.name = name; 
        this.Show(); // 不可执行 
         
        if(typeof(TestClass._initialized) == "undefined") 
        { 
            TestClass.prototype.Show = function() 
            { 
                alert(this.name); 
            } 
        } 
    } // obj.Show()不可执行 
    var TestClass = function(name) 

        this.name = name; 
        this.Show();// 不可执行 
         
        if(typeof(TestClass._initialized) == "undefined") 
        { 
            TestClass.prototype =  
            { 
                Show:function() 
                { 
                    alert(this.name); 
                } 
            } 
        } 

    */ var obj = new TestClass('MyName'); 
    obj.Show(); </script>
      

  2.   


    谢谢 wilowind 请问第三个类的实例obj.Show()为什么也没法执行.
      

  3.   

    至于下面的操作,是从构造里来改变原型。虽然这样写也会把wc所继承。打错个字至于下面的操作,是从构造里来改变原型。虽然这样写也会被wc所继承。
      

  4.   

    谢谢 muxrwc 第三个类 在var obj = new TestClass()之后obj.Show()也会失败 请问这是为什么
      

  5.   

    第三种的话。
    它直接改变了原型的引用
    这样的话。
    只能在下次new TestClass时,才会生效可以抽象理解成
    第三种:
    var a = {}; //a就是TestClass
    var b = a; //b就是wc
    a = [];
    这时b不会变化对吧
    这个就和你第3种是一个情况然而第二种:var a = {};
    var b = a;
    a.c = [];
      

  6.   

    明白了 非常感谢 muxrwc 结贴