日期:2014-05-17 浏览次数:20700 次
文西马龙:http://blog.csdn.net/wenximalong/
js面向(基于)对象编程——类(原型对象)与对象
this—问题提出
请大家先看一段代码:
function Person(){ } var p1=new Person(); p1.name="顺平"; p1.age=60; window.alert(p1.name+" "+p1.age); var p2=new Person(); window.alert(p2.name); //这里会输出什么?(undefined)
function Person(){ this.name="abc" this.age=90; } var p1=new Person(); var p2=new Person(); pa.name="顺平"; window.alert(p1.name+" "+p2.name); //输出 abc abc
内存图分析
图片大,在新窗口中打开图片,观看完整图片。
<html> <head> <script language="javascript"> function Person(){ var name="abc"; //如果这样去使用 name这个属性是私有的 this.name2="abc2"; //this.name2 表示name2这个属性是公开的 //这个就是Person的一个公开方法 //如果你一定要访问私有属性,则需要定义一个公开方法(特权方法) this.show=function(){ window.alert(name); //name属性是私有的 } //这个是私有方法,只能在Person类中使用 //如果想在外部使用show2,可以在this.show中调用 //javascript中大部分方法都是公开的 function show2(){ } } var p1=new Person(); //这样调用name属性,会报undefined window.alert(p1.name); //输出 abc2 //name2属性是公开的 window.alert(p1.name2); //如果要访问私有属性name,就要在类中定义一个公开的方法,比如定义一个show方法 p1.show(); </script> </head> <body><body> </html>
<html> <head> <script language="javascript"> function test1(){ alert(this.v); } var v=90; window.test1();// 输出什么 等价于== test1(); // alert("ok"); <==> window.alert("ok"); //哪个对象实例调用this所在的函数,那么this就代表哪个对象实例 //window.test1(); this就是window,进去了以后,调test1,如果test1里面有this,那个这个this就是调用者window,这个this有没有v呢,在外面定义了一个v=90。window对象是全局对象。 window.alert(v); //输出v window.alert(window.v) //同样输出的v,和上面的一样的。window对象是全局对象,在上面的test1函数中alert(this.v);,不就是等同于alert(window.v);吗,这样就容易理解了 //什么叫当前对象是this呢 function Person(){ this.abc=function(){ window.alert(this.v); //这里的this就是p,谁调用this,this就是谁 } } var p=new Person(); p.v="hello"; //动态的 p.abc(); //p调用abc,p就是里面的this,而this确实有v这个属性,则hello就被输出了 </script> </head> <body></body> </html>
内存分析图
图片大,在新窗口中打开图片,观看完整图片。