本帖最后由 joygarden 于 2010-10-29 15:30:19 编辑

解决方案 »

  1.   

    执行一遍,function SuperType(){
    this.colors = ["red", "blue", "green"];
    }//如这里的执行环境是globle 所以window获得了color属性
    //SuperType();
    //alert(window.colors);function SubType(){//这里的执行环境是什么?谁得到了colors属性
    SuperType();
    //无法得到colors值
    alert(window.colors);
    alert(this.colors);
    }var instance = new SubType();
    //无法得到colors值
    alert(instance.colors);
    弄明白了吗?呵呵~
      

  2.   

    哦 它的scope 还是globle的啊
      

  3.   

    你这里的是想要弄明白this的指向吧?
    如果SuperType被new了,那么this指向他自己,如果没有被new直接调用,那么this指向他的父对象,没有父对象,指向最顶层(window)。
    这个与你在哪个函数里调用它没有关系,因为你声明supertype的时候是声明的全局的。
      

  4.   


    在SubType(){}里面加上
    alert(window == this);
    看看,这个作何解释呢?
      

  5.   


    <script>
    function SuperType(){
    this.colors = ["red", "blue", "green"];
    }
    //如这里的执行环境是globle 所以window获得了color属性
    SuperType();
    alert('window被赋值'+window.colors);function SubType(){
    SuperType(); //还是给window添加,它没有new,所以它的this还是指向声明的时候的父对象,即window
    alert(this.colors); //没有new的时候this是window,new了this就是这个类的实例。
    }
    SubType(); //还是window被赋值var instance = new SubType();  //new了,它以后this弹出的都是自己的东西了,但是构造函数调用的SuperType里的this还是指向window,不会给这个实例添加属性的。
    alert(instance.colors);  //构造函数执行的只是为window赋值,与实例无关,所以是undefined</script>
      

  6.   


    alert(window == this);
     SubType();是true
    new SubType();则是false
    解释应该如4楼说的吧
      

  7.   

    这才是js的精髓。
    一个是灵活的this,一个是闭包。
    想玩的话,还有更好玩的。var abc = {};
    abc.aaa = 'aaa';
    function showaaa(){
        alert(this.aaa);
    }
    showaaa.call(abc);
      

  8.   

    这个例子是call执行function可以传递对象 改变this指向原因吧, Constructor Stealing方式继承也是用这个实现的ps: 正在看javascript高级程序设计第二版 的Constructor Stealing一节