//双精度浮点数包装类
        function Double(value)
        {
            value=parseFloat(value);
            if(!isNaN(value) && this && this.constructor==arguments.callee)
            {
                //如果是作为构造函数执行,那么满足this.constructor==arguments.callee
                //这个时候构造一个Double对象,给出doubleValue()和valueOf()方法
                this.doubleValue=function()
                {
                    return value+"double";
                }
                this.valueOf=function()
                {
                    return value;
                }
                this.toString=function()
                {
                    return value.toString()+"string";
                }
                
            }
            else
                return value;//否则直接返回该值
        }
        var d_boxing=new Double(123.34);    //d_boxing是一个包装对象
        var d_unboxing=Double("123.34");    //d_unboxing是一个普通数值
        dwn(d_boxing.doubleValue());
        dwn(typeof d_boxing);//
        dwn(d_unboxing);
        dwn(typeof d_unboxing);//对这这里面有几个不明白,忘高手指点,分只给最详细的人
1.this写在if里面表示怎么意思
2.this.constructor表示是什么意思
3.arguments.callee表示是什么意思
4.在什么时候this.constructor==arguments.callee
5.为什么d_boxing为object类型,d_unboxing为number类型
6.在没有指定调用if里面的三个方法即(doubleValue(),valueOf(),toString)的时候,系统会自动调用哪一个方法,为什么

.分只给最详细的人,谢谢

解决方案 »

  1.   

    arguments.callee和caller是相对的一个表示函数本身,一个表示调用者.在没有指定调用if里面的三个方法即(doubleValue(),valueOf(),toString)的时候,系统会自动调用哪一个方法,为什么 
    系统哪个都不会调用,除非你手写去调用这个对象的方法,比如 toString
      

  2.   

    一、if里面的this判断当前调用改构造函数的对象是否存在!二、this.constructor就是d_boxing或别的用new关键字实例化Double对象的函数!三、arguments.callee里面的callee是arguments的一个属性,他指的就是调用当前函数的一个函数引用!四、new出来的对象的引用和调用这个函数的引用相同的话,他们就相等了!五、d_unboxing里面存的是个数字,因为在JavaScript中数字只有双精度的,即number类型的。
        而d_boxing存的是个对象的引用,在JavaScript中函数变量(对象)和字符串变量还有数组变量存的都是引用,所以它只能
        属于object类型的。六、如果你if里面为空,它会调用valueOf(),toString().   
      

  3.   

    re:
    1. this 只要在对象里面就是表示它代表的是这个对象本身, 不管它是在if for的那里。
    2. this.constructor表示对象的构造函数,即function Double(value) {……}
    3. arguments.callee 指的是调用这个函数的函数引用,如果是没有函数调用 则为null.
    4.5 楼上都说了。
    6.在没有指定调用if里面的三个方法即(doubleValue(),valueOf(),toString)的时候,系统会自动调用哪一个方法,为什么 
    没太明白你说意思??我理解,系统不会自动调用那一个方法的。 只能 var d_boxing=new Double(123.34); d_boxing.toString();这样来调用。
      

  4.   

    1: this 表示对象的事例本身,不管它放在if还是其他地方。
    2: constructor 是对象的构造行数,但是他只对构造(new)对象有意义,这是他很trick的地方:
    var d_unboxing=Double("123.34");  这句话的执行过程中,constructor 没有意义;
    var d_boxing=new Double(123.34); 这句话中constructor 就是Double这个function.
    我给你一个更简单的例子你就明白了:function Foo(){
        alert(arguments.callee==this.constructor);
    }
    var a = new Foo();//构造对象
    Foo();//直接调用函数看看这执行的结果。
    3: 但是callee总是有意义的,不管你是直接调用函数还是把这个函数用来构造对象。function Foo(){
    alert(arguments.callee);
    }
    var a = new Foo();
    Foo();4: 综合上面的2,3,当你用Double构造对象的时候callee和constructor是一致的。
    5: 因为d_boxing是你new出来的,而且根据你的构造函数,它会走if(!isNaN(value) && this && this.constructor==arguments.callee)这个分支,构造了一个完整的Double对象。d_unboxing是你直接调用Double,将会走else  return value;分支,返回value本身;
    6: 我是这样理解的:如果你alert(d_boxing);则会打印出toString()的内容;如果你把toString方法去掉,则会打印出[object Object];这是它的prototype的toString方法返回的东西。
      

  5.   

    1: this 表示对象的事例本身,不管它放在if还是其他地方。 
    2: constructor 是对象的构造行数,但是他只对构造(new)对象有意义,这是他很trick的地方: 
    var d_unboxing=Double("123.34");  这句话的执行过程中,constructor 没有意义; 
    var d_boxing=new Double(123.34); 这句话中constructor 就是Double这个function. 
    我给你一个更简单的例子你就明白了: JScript code
    function Foo(){
        alert(arguments.callee==this.constructor);
    }
    var a = new Foo();//构造对象
    Foo();//直接调用函数看看这执行的结果。 
    3: 但是callee总是有意义的,不管你是直接调用函数还是把这个函数用来构造对象。 JScript code
    function Foo(){
        alert(arguments.callee);
    }
    var a = new Foo();
    Foo();4: 综合上面的2,3,当你用Double构造对象的时候callee和constructor是一致的。 
    5: 因为d_boxing是你new出来的,而且根据你的构造函数,它会走if(!isNaN(value) && this && this.constructor==arguments.callee)这个分支,构造了一个完整的Double对象。d_unboxing是你直接调用Double,将会走else  return value;分支,返回value本身; 
    6: 我是这样理解的:如果你alert(d_boxing);则会打印出toString()的内容;如果你把toString方法去掉,则会打印出[object Object];这是它的prototype的toString方法返回的东西。
    正解
      

  6.   

    我觉得this是document,来判断document的各个属性
    其他同
      

  7.   

    function Foo(){ 
        alert(arguments.callee==this.constructor); 

    var a = new Foo();//true 构造对象 
    Foo();//false 直接调用函数 ----------
    function Foo(){ 
        alert(arguments.callee); 

    var a = new Foo(); 
    Foo();
    ------------
    function Foo(){ 
        alert(this.constructor); 

    var a = new Foo(); 
    Foo();//undefined运行以上三段代码,就能理解:constructor 只是对 new 出的对象 有效,也就是说,是 new出对象的一个属性,是儿子才有的属性,老子没有的
    arguments.callee 属性总是有效的,不管你是直接调用函数还是把这个函数用来构造对象。