当我们创建一个类对象的时候,希望创建对象以后就有一些属性,可以通过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。