function Test(a,b) 

  this.A = a; 
document.write(A);
  this.B = b; 
document.write(B)
} Test.jiechu= function(c,d) 

   this.A = c; 
document.write(A);
  this.B = d; 
document.write(B)
}
Test(2,4);//2,4
Test.jiechu(14,18)//2,4
为什么 Test.jieche(14,18)的值不是 14,18 ?

解决方案 »

  1.   

    请看下面代码中的注释write=function(str) {
    document.write(str+"<br/>");
    }
    function Test(a,b) 

    write(this==window);//这里的this表示全局对象window
      this.A = a; //这样就表示A是一样全局对象了
    write(A); 
      this.B = b; 
    write(B) 

    Test.jiechu= function(c,d) 

      this.A = c; 
    write(this.A); //这样才行
      this.B = d; 
    write(B) //不加this直接在全局对象中查找B

    Test(2,4);
    Test.jiechu(14,18)//
      

  2.   

    function Test2(a,b) 

    write(this==window);//这里的this表示全局对象window
      this.A = a+a; //这样就表示A是一样全局对象了
    write(A); 
      this.B = 2*b; //数学中的 2b 的写法 ,不行
    write(B) 

    Test2.jieru=Test.jiechu; //借用Test 的方法
    Test(2,4);
    Test.jiechu(14,18);
    Test2(1,2);
    Test2.jieru(90,90)
    一个 对象可以借用另一个对象的方法。
      

  3.   

    write=function(str) {
        document.write(str+"<br/>");
    }
    function Test(a,b) 

    write(this==window);//这里的this表示全局对象window
      this.A = a; //这样就表示A是一样全局对象了
    write(A); 
      this.B = b; 
    write(B) 

    Test.jiechu= function(c,d) 

      this.A = c; 
    write(this.A); //这样才行
      this.B = d; 
    write(B) //不加this直接在全局对象中查找B

    执行结果:true
    2
    4
    14
    4
    可是,如果是这样:
    write=function(str) {
        document.write(str+"<br/>");
    }
    function Test(a,b) 

    write(this==window);//这里的this表示全局对象window
      this.A = a; //这样就表示A是一样全局对象了
    write(A); 
      this.B = b; 
    write(B) 

    Test.prototype.jiechu= function(c,d) 

      this.A = c; 
    write(this.A); //这样才行
      this.B = d; 
    write(B) //不加this直接在全局对象中查找B
    } Test(2,4);
    Test.jiechu(14,18);
    执行结果就是:
    true
    2
    4
    为什么 jiuchu 不能调用了?
    Test(2,4);
    Test.jiechu(14,18);
      

  4.   

    函数原型上的属性和方法,函数本身不能调用。请看:var write=function(str) {
        document.write(str+"<br/>");
    }
    function Test(a,b) 

    write(this==window);
      this.A = a; 
       write(A); 
      this.B = b; 
    write(B) 

    Test.prototype.jiechu= function(c,d) 

      this.A = c; 
    write(this.A); 
      this.B = d; 
    write(this.B) 

    Test.prototype.jie=80Test(2,4); write(Test.jie);
    Test.jiechu(0,0)
    如果只是设置Test的属性,去掉  红色 字体部分,就能正常运行了。
    Oh,my God!
      

  5.   


    function Test(a,b) 
    {
    alert(this == window);
    } Test.jiechu= function(c,d) 
    {
    alert(this == Test);
    }Test(1, 2);
    Test.jiechu(3, 4);你会发现两者中 this 指向的不同
      

  6.   

    二者是不同。可我还有个疑问:属性查找时,不是先就近查找吗?先查找局部变量,再查找全局的。既然本身有个 A ,为什么还要到 window上找 A 去?
      

  7.   

    Test.jiechu= function(c,d) 

      this.A = c; 
    write(this.A); //这样才行
      this.B = d; 
    write(B) //不加this直接在全局对象中查找B
    } //这个匿名函数是在全局环境 window 上定义的,是吗?它的作用域链 是window ,对吗?这样 B 的值,就好理解了。
    请高手指教。
      

  8.   

    函数的call/apply方法,说的就是这种情况。自我表扬一下,你竟然发现了这个问题!
      

  9.   

    下面是 某教程中的例子:
     function dwn(s)       {              document.write(s + "<br/>");       }       function myClass()       {              var p = 100;  //private property; 私有属性              this.x = 10;  //dynamic public property 动态公有属性       }       myClass.prototype.y = 20; //static public property or prototype property 原型属性       myClass.z = 30;  //static property //静态属性       var a = new myClass();       dwn(a.p);  //undefined 私有属性对象无法访问到       dwn(a.x);   //10  公有属性       dwn(a.y);   //20  公有属性       a.x = 20;       a.y = 40;       dwn(a.x);    //20         dwn(a.y);    //40  //动态公有属性y覆盖了原型属性y       delete(a.x);       delete(a.y);       dwn(a.x);    //undefined  动态公有属性x被删除后不存在       dwn(a.y);    //20  动态公有属性y被删除后还原为原型属性y       dwn(a.z);    //undefined 类属性无法通过对象访问       dwn(myClass.z);  //30 类属性应该通过类访问