javascript 面向对象问题

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <title> New Document </title>
  <script type="text/javascript">
    var IdCard = function(paperNo){     
        var validId15=function(){
            //alert(paperNo);
            return false;
        }
        var validId18=function(){
            //alert(paperNo);
            return false;
        }
        var valid = function (){                
                if(paperNo.length==15){    
                    return validId15();    
                }else if(paperNo.length==18){    
                    return validId18();    
                }
                return false;
        }

        this.validate = {
            valueOf: valid,
            toString: valid
        }

    }
    function test(){
        idCard = new IdCard("123456789012345678");
        
        alert(idCard.validate);     //此处打印 false
        if(idCard.validate) alert(true);        //此处打印 true
    }
  </script>
 </head>

 <body>
  <input type="button" value="" onclick="test()">
 </body>
</html>

 if中的idCard.validate没有被执行,为什么?该怎么修改?

[quote]
alert(idCard.validate); //此处打印 false

if(idCard.validate) alert(true); //此处打印true

[/quote]

修改为

[code="java"]
alert(idCard.validate.valueOf()); //此处打印 false

if(idCard.validate.valueOf()) alert(true); //此处不会打印

[/code]

原因:alert(idCard.validate)会依次执行对象字面量中的valueOf和toString 方法,但alert()方面只显示了最后toString的值;
if(idCard.validate)自然是返回一个不为null的js对象,所以执行alert(true);

你修改
[code="java"]
this.validate = {

valueOf: valid,

toString: function(){
alert("hello");
}

}

[/code]

这里不变
[quote]
alert(idCard.validate); //此处打印 false

if(idCard.validate) alert(true); //此处打印 true

[/quote]

就会发现先弹出hello,而alert(idCard.validate);就返回了undefined,因为toString()无返回值了嘛,而if(idCard.validate)自然不为null,弹出true。

[quote]alert(idCard.validate); //此处打印 false

[/quote]
这个地方可以打印出数据?
如果是这样的话,可以修改

[quote]
if(idCard.validate) alert(true); //此处打印 true

[/quote]
修改为
if(idCard.validate==true) alert(true); //此处打印 true
试试

[quote]alert(idCard.validate); //此处打印 false

if(idCard.validate) alert(true); //此处打印 true [/quote]

把 if(idCard.validate) alert(true);

修改为 if(idCard.validate == true) alert(true);

以上回答有些错误,要纠正下,开始我认为
[quote]alert(idCard.validate);[/quote]
显示的应该是个[object Object],
而不是去执行valueOf和toString 方法,但运行执行却是弹出了false;
不理解怎么是false,检查这个回答时发现
[quote]
去执行valueOf和toString方法
[/quote]
突然间想起了如果对象重写了toString()方法,alert(obj)时就会调用此方法,故疑团也就解决了。

你把toString改个名字,就会显示[object Object]。