因为你调用了 SetName()就将height设置为177le

解决方案 »

  1.   

    这个我知道,难道可以继承heigth,它是个私有成员啊!难到能继承??
      

  2.   

    <html><head>
    <meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
    <title>新しいページ 1</title>
    <script>
    function MyUser() 

    public: 
      this.name="L.L.L"; 
      this.year=22; 
      this.Say=function() 
      { 
      alert(this.name); 
      alert(this.heigth); 
      } 
    private: 
      this.heigth=163; 

    function YourUser() 

    EXTENDS: 
      this.Super=MyUser; 
      this.Super(); 
      
    public: 
      this.SetName=function() 
      { 
      this.name="J.J.J"; 
      heigth=177;
      } 

    function GetPersonValue() 

    var youru=new YourUser(); 
    youru.SetName(); 
    youru.Say();

    window.onload=GetPersonValue;
    </script>
    </head>
    <body>
    </body>
    </html>
      

  3.   

    ,奇怪的写法??javascript的继承只能通过prototype来模拟c++,java等的继承不是么???
    没见过这种写法,待高人解惑
      

  4.   

    LZ这里的public,private仅仅是作为标号名称而已,没有任何其他含义like thisvar outer = 1;
    public:
    for(;;){
    document.write("The outer is : " + outer + "<br>");
    outer++;
    var inner = 1;
    private:
    for(;;){
    if(outer>5) break public;
    if(inner>5) break private;
    document.write("The inner is : " + inner + "<br>");
    inner++;
    }
    document.write("<br>");
    document.write("<br>");
    document.write("<br>");
    }
      

  5.   

    LZ这里的public,private仅仅是作为标号名称而已,没有任何其他含义 like this怪自己不听讲,哈哈,书上有,忘了
      

  6.   

    lzd对于OOP的概念根深蒂固。有些概念在javascript是不一样的了。3楼的给出了答案,但没有分析原来,我们来分析一下:
    在MyUser()中,定义了
    private: 
      heigth=163;这真的是私有变量吗,用调试工具你可发现,这个变量实际上是被放在了window下,而不是this的私有变量。也就是说任何不带var申明的变量都被放在了函数调用链的根对象上,这里就是window,而如果是var heigth=163;(像3楼那样),则heigth就放在了当前函数调用的上下文对象里。在调用youru.SetName()时,语句heigth=177应该怎么理解了?首先在this下找,结果没有,然后在当前函数调用空间里找,结果也没有,然后顺着函数调用对象链,一直找到window下,发现heigth申明了,因此修改heigth的值,由163变为177。调用youru.Say()时,寻找heigth的原理与youru.SetName()一样,实际上是找到了window下的height=177。
    为什么在MyUser()中,定义
    private: 
      var heigth=163;
    情况不一样呢?要理解的话,必须掌握闭包的概念。不是一下能说明的,希望lz基线努力学习。总的来说,lz想要实现私有变量,应该加上var进行申明。
      

  7.   

    <script type="text/javascript">
    var height = 0;function MyUser(){
        this.name="L.L.L";
        this.year=22;
        this.Say=function(){
          alert(this.name);
          alert(height);
        }
        height=163;//window.height here
    }function YourUser(){
        this.Super=MyUser;
        this.Super();
        this.SetName=function(){
          this.name="J.J.J";
          height=177;//window.height here
        }
    }function GetPersonValue(){
      var youru=new YourUser();
      youru.SetName();
      youru.Say();//J.J.J和177
    }GetPersonValue();alert(height);//window.height has been changed
    </script>
      

  8.   

    可以參見:
    JavaScript作用域链scope chain
    http://www.v-ec.com/dh20156/article.asp?id=160JavaScript原型链prototype chain
    http://www.v-ec.com/dh20156/article.asp?id=157
      

  9.   

    最主要的还是关键字VAR的使用
    JScript的语法教程里面说在声明变量时忽略var要害字是完全合法的。但是事实经常又证实想当然的结果是不可靠的。
      看看下面这几个例子的结果就知道问题了: 
      
      <script language="javascript">
      var var00 = 0;
      document.write(var00 + '<br>');
      var var01 = 1;
      function foo()
      {
      document.write(var01); 
      var var01 = 1;
      }
      foo();
      </script>
      
      <script language="Javascript">
      var00 = 0;
      document.write(var00 + '<br>');
      var01 = 1;
      function foo()
      {
      document.write(var01); 
      var01 = 1;
      }
      foo();
      </script>
      
      <script language="javascript">
      var00 = 0;
      document.write(var00 + '<br>');
      var01 = 1;
      function foo()
      {
      document.write(var01); 
      var var01 = 1;
      }
      foo();
      </script>
      这三个例子的执行结果分别是:
      
      Results#region Results
      No.1
      0
      undefined
      No.2
      0
      1
      No.3
      0
      undefined
      #endregion
      原来JavaScript的变量也是有作用域的,只是它非常的笼统,就分为全局变量和函数变量。在第二个例子中得到0和1,是因为所有的变量都是全局变量,而且那个语句块一共就定义了两个变量。而第一个第三的函数外全局变量,确实说明var要害字有没有都没有关系。而函数内的var要害字就很要害了,它说明第二个var01是函数内的变量,所以在初始化var01前输出自然就是'undefined'了。
      那么函数里面是不是就屏蔽掉了全局的var01了呢?我们知道在C/C++可以使用::去访问全局变量,那么JavaScript可不可以呢?这里其实我们只要明白了全局变量到底是什么东西,就好弄了。原来全局变量都是动态添加到Window对象的实例window上的属性而以,所以我们只要在函数内用:document.write(window.var01);就可以取到其值1了。同时在这个上下文中,function内的this也是指向的window实例,我们也可以把引用写成:this.var01。
      顺便说一下,重看JScript教程时,它说变量只能是[a-zA-Z_]+[a-zA-Z0-9_]*格式,可是'$'却也可以作为变量名字符,而且还可以用在开头,比如:$1234,更甚至于:$$$ 也是合法的变量名,faint。
      <script type="text/javascript"> 
      <!-- 
      //这样写js的语句块更好一些:) 
      --> 
      </script> 
      我想知道是不是.在调用一个函数时,程序执行顺序会先检查函数内部变量中,有没有要害字var. 然后中再根据检查结果给不同的变量付予不同的作用域和变量值.因为我看到在这三个函数中,var01变量都是在输出语句之后. 
      function get_global_var(___name) 
      { 
      return eval(___name); 
      } 
      function set_global_var(___name,___value) 
      { 
      eval(___name+"=___value"); 
      } 
      var aa=11; 
      Test(); 
      WScript.Echo(aa);//22 
      function Test() 
      { 
      var aa=33; 
      WScript.Echo(get_global_var("aa"));//11 
      set_global_var("aa",22); 
      WScript.Echo(get_global_var("aa"));//22 
      WScript.Echo(aa);//33 
      } 
      在上面的例子中this从来就没有指过Test,而一直都是WScript的实例。 
      假如我们写一个语句:var test = new Test(); 这时Test里的this就是指的Test的一个实例了,这个实例中假如要使用Global的变量,Lostinet给出的是一个方法。 
      不过最简单还是把global传入对象,这样定义Test: 
      function Test(global) 
      { 
      // ... 
      }