asp学习网: 首页 >> javascript教程 >> js中的方法(对象)研究
js中的方法(对象)研究
<!--
//js中的方法(对象)研究
//研究人:hamal
//这是我研究js中方法过程中写的一个例子,觉得挺有意思的,放上来给大家参考下
//使用方法:直接全部拷贝到本地的一个html文件内即可开始研究了 ^_^
//我定义的是一个带参数的test1(arg1)方法(对象)
//当你是第一次研究这个示例时,我建议你最好是从上到下的开始研究,因为后面有部分解释利用了一些前面的结论。
//你可以从上到下的逐步开放代码前的//注释来研究,研究到后面部分时再注释掉前面你不再关心的代码。
function test1(arg1){
//下面是定义变量的3种基本方法,对应下面的代码,你可以简单采用注释其中两个定义的方法来慢慢研究。
//a = arg1;//这里定义的a是一个和test1平级别的变量,即a和test1都是window对象的属性,a不在test1中,不是test1的属性。
//var a = arg1;//这里定义的a仅仅是一个在test1方法内可用的变量,它不是test1的属性,而且它不能被该方法外部的任何代码直接使用。
this.a = arg1;//这里定义的a不仅是this对象的一个属性(注意this对象不一定是test1对象^_^,他可能会是window对象或其他一切对象),而且方法外部的代码可以使用this所指的对象的一个具体实例加.a的方式引用他。例如如果this代表window对象,则在test1()方法外部和内部,我们都可以直接使用变量a了。
alert("in");//这句最好不要注释掉,很多地方的代码执行过程需要通过他才能发现。
//return "return value";//我认为,如果方法没有定义返回值,则系统自动为方法返回一个undefined类型。当你想看方法的返回值时可以去掉前面的注释。
}
/*
对于alert(test1());语句,alert()方法的参数如果是一个方法,则alert()会做2件事:1.执行该方法,2.将该方法的返回值作为alert()方法的参数。
下面代码想调用test1()方法(对象),但不传入参数,js与java和c++不同,对方法没有参数重载的概念,只要没有语法和运行错误,js解释器会调用test1(arg1)方法,并接受test1(arg1)方法的返回值做参数,但由于test1(arg1)方法没有定义返回值(这是在注释掉return语句的情况下,当然,在完成了下面的研究后,你就可以开放return语句研究了),所以在test1(arg1)方法成功执行之后,我认为有两种解释都可以很好的说明程序的实际表现:
1. test1(arg1)方法会返回一个undefined,即任意没有定义返回值的方法默认返回一个undefined数据类型。
2. alert()方法会检查test1(arg1)方法的返回值,当没有检测到时,会将自己的参数设置为undefined数据类型。
我个人更倾向于采用第1种解释方法。因为,我认为如此的设计会使js解释器更简单,使js更具灵活性。
*/
alert(test1());//执行test1(arg1)方法,并在没有出现语法和运行错误的情况下,使用test1(arg1)方法的返回值来显示。
/*
当在test1(arg1)中使用a = arg1;定义a时这里会显示undefined。由于arg1在方法被调用时未传入,所以arg1为undefined,再将这个值赋给a,而且a是window的属性。
当在test1(arg1)中使用var a = arg1;定义a时这里会出现js的脚本运行时错误。因为这里在window对象中根本就没有声明a这个变量。
当在test1(arg1)中使用this.a = arg1;定义a时这里会显示undefined。由于arg1在方法被调用时未传入,所以arg1为undefined,再将这个值赋给a,而且a是window的属性。为什么a会是window的属性而不是test1的属性呢?这都是因为this关键字,this关键字代表当前系统中正在使用的对象。上面的代码alert(test1());相当于alert(window.test1());显然现在的当前运行对象是window,所this代表window,this.a就相当于window.a
*/
//alert(a);//这里的a很有意思,我们应该注意。
//alert(test1.a);//最好在你研究完并明白下面的alert(test1);语句部分之后再来自己研究这句的各种结果,那时你所需要知道的概念和说明我都已经描述过了,你需要的只是自己去动动脑筋,呵呵。
/*
这里我简单解释下4种不同的变量状态,这只是我个人的定义,大家可以参考:
1. alert(some_var);
如果some_var变量没有被声明(我称形如var some_var;或some_var;的语句形式为声明),则运行alert()时会报js运行时错误。
2. var some_var; 或 some_var;
alert(some_var);
如果是这种形式的代码,变量被声明但没有被初始化(我称形如var some_var = null;或var some_var = 某个非undefined值表达式;的语句形式为初始化),则运行alert();时会显示undefined。
3. var some_var = 某个值为null的表达式;
alert(some_var);
如果是这种形式的代码,变量被初始化为null,显然运行alert();时会显示null。
4. var some_var = 某个非undefined、非null值的表达式;
alert(some_var);
这是最常见的形式了,我就不多解释了。
*/
/*
执行test1(1,2)方法,并使用test1(1,2)方法的返回值来显示。在本例中alert(test1())和alert(test1(1,2))的显示现象没有什么不同。但实质执行有所区别。test1()中的a将是一个undefined类型,test1(1,2)中的a的值为整数1,其第二个参数2没有什么实际意义,因为在test1(arg1)中不可能使用这个参数。
*/
alert(test1(1,2));//执行test1(arg1)方法,并使用test1(arg1)方法的返回值来显示。
/*
当在test1(arg1)中使用a = arg1;定义a时这里会显示1。由于arg1在方法被调用时被赋予了传入的第一个参数1,所以arg1为1,再将这个值赋给a,而且a是window的属性。
当在test1(arg1)中使用var a = arg1;定义a时这里会出现js的脚本运行时错误。因为这里在window对象中根本就没有声明a这个变量。
当在test1(arg1)中使用this.a = arg1;定义a时这里会显示1。由于arg1在方法被调用时被赋予了传入的第一个参数1,所以arg1为1,再将这个值赋给a,而且a是window的属性。至于原因,上面部分已解释了。
*/
//alert(a);//这里的a也很有意思,我们也应该注意。特别是同时开放alert(test1());和alert(test1(1,2));语句后为什么这句和前面相同的语句却得到不同的结果???
/*
对于alert(test1);语句,alert()方法的参数如果是一个变量,则alert()会先检测该变量是否已被声明过(即是否存在该变量)?若否,则alert()方法会显示undefined,若是则继续判断该变量是否是字符串?若是则显示,若不是则调用变量的toString()方法获得该变量的字符串表示,并显示之。
在本例中,alert(test1)实质是调用当前window对象的一个属性window.test1,由于test1已经在前面定义过了,并且test1不是字符串变量,所以js解释器会自动调用test1的toString()方法,并将返回值送入alert()方法中。
对方法调用toString()方法所得的返回值,有些类似于在HTML中的Object.outerHTML属性值的概念。
*/
alert(test1);//在本例中,这句等价于alert(test1.toString());显示出test1(arg1)方法的文本。
/*
注意:虽然在js中,方法就是对象的一种,而对象又是变量的一种。但同样是变量,对方法的处理与其它变量有所不同:
如果是test1()的调用方式,则会首先执行方法内代码,在不出现语法和运行错误的情况下,最后返回方法的返回值。
如果是test1的调用方式,则不会执行方法内代码,而是直接进行变量类型判断,直到调用toString()方法。(变量类型判断过程前面已说明)
*/
/*
当使用new test1(3)来生成test1的一个实例时,系统会执行以下两步操作:
1.顺序执行test1(arg1)方法中的代码,在本例中我们会看到alert("in");语句会被执行。
2.将这个新的test1对象的实例的引用(即指针)赋给变量tt。
*/
//var tt = new test1(3);//可以和下面的某个语句一起使用
//alert(tt.a);//分别开放test1(arg1)方法中的3种定义,自己解释下为什么吧^_^,现在应该很好理解了。再开放return语句,想想看。
//alert(test1.a);//同上
//alert(a);//同上
/*
下面是个很奇怪的一个语句,呵呵。在完全掌握了上面的代码后,大家就可以自己想些奇怪的代码来研究了^_^
*/
//alert(test1("4").a);//靠自己罗,多思考
//alert(a);//靠自己罗,多思考
//这个例子比较烦琐,大多是相同的结果由不同原因造成,但也有不少相同的语句在不同情况下可能得到不同的结果。祝大家能搞清楚其中全部的因果关系,因因果果,果果因因,修成正果,阿弥陀佛 ^_^ hamal。
//-->
</script>
from:asp学习网/title:js中的方法(对象)研究/ time:2007-3-3 16:03:04
本文主题js中的方法(对象)研究