当我们创建一个类对象的时候,希望创建对象以后就有一些属性,可以通过this关键字来实现。
p1.name访问的是自己的name。不是person类型的name,因为它是私有的属性。类的公有属性可以通过this.name2来表示name2属性是公开的,它的实例可以访问。this关键字用于区分私有的还是公开的。
function Person() { var name = "abc"; //私有属性,只能在内部访问。 var age =90; //私有属性 this.name2 ="abc2"; //公有属性,可以通过其对象来访问 this.show = function() //公开的方法 { window.alert(name+" "+age); //这是person类的公开方法。 show2(); //在类里面调用私有方法。 } function show2() //这是person类的私有方法,私有方法和私有属性只能在类内部使用。 { window.alert("nihao "); } } var p1 = new Person(); p1.show(); //pi.show2(); //报错 //p1.name+p1.age //错误
那个对象实例调用this所在的函数,那么这个this就表示那个对象实例。
function test1() //这个方法属于默认对象window { alert(this.v); //如果window调用这个方法,this表示window对象 } //window表示当前页面对象。 var v=90; window.test1(); //这个属性属于默认对象window 。显示的结果是90. 等价于test1(); //alert("ok");与 window.alert("ok");一样。
this变量只能在类的方法中使用,不能在类定义以外使用。在类外使用可能会变成另外一个对象。
给js对象添加方法的方式:
function person() { this.name = "abc"; this.age = 900; this.show=function show() //第一种方式创建方法。类的所有对象都可以调用这个方法。 { document.write("nihao "+this.age); } } function show1() { document.write("hello "+this.name); } var p1 = new person(); //如果show1加上(),表示把show1的返回值给abc。 //给类对象添加方法的第二种方法。 p1.abc = show1; //p1新建一个abc方法,方法和show1一样。 p1.abc(); // 调用第二种方法。只有p1可以用这个方法。 p1.show(); //调用第一种方法 document.write(show1); //直接打印出函数。
function Dog() {} var dog1 = new Dog(); dog1.shout = function() //只属于dog1的方法。 { document.writeln("给dog1动态添加方法"); } dog1.shout(); var dog2 = new Dog();
dog2.shout(); //出错。。。
prototype属性的使用:通过它绑定的方法是属于类的,不是属于对象的,所有对象公用一个通过它绑定的属性和方法。
可以解决每个对象独占一个方法的缺点(占用太多内存)。可以通过prototype来让多个对象共享一个方法。
function Dog() { } //使用prototype[类]去绑定一个函数给shout。 //所有的js对象都有一个prototype属性,这个属性可以动态的绑定一个值。 //这个类的所有对象可以共享protytype属性绑定的方法。 Dog.prototype.shout = function(){ document.writeln("hahahahahah"); } var dog1 =new Dog(); var dog2 = new Dog(); dog1.shout(); dog2.shout();
document.writeln(dog1.shout==dog2.shout); //可以用于判断两个对象是不是同一个对象。用地址判断。
运行结果如下:
hahahahahah hahahahahah true
内存示意图:
==的作用:
当==两边都是字符串的时候,则比较内容是否相等。返回一个true。
当==两点是数字,则判断数字是否相等。
当==两边是对象,则比较对象的地址时候相等。如果相等,返回true。