javascript中,每个function都拥有一个原型对象prototype,通过这个对象可以为这个类定义各种属性和方法,但是这样定义的属性和方法是所有该类的对象所共有的,效果上和同这个类的父类中继承的字段和方法差不多。通常我们使用function的原型来创建类的方法,而用普通方式来创建类的属性。
1.为什么不用原型来创建属性
因为原型创建的内容是这个类所有对象所共享的,对于一个属性而言,不同的类的对象的值都不一样。如果使用原型对象来创建对象属性,那么任何一个类的对象修改了自己的某个属性,其他对象的相同属性也会被修改。
这么做的本质是因为:属性是各个对象不同的,要求对象自己保存自己该属性的值,而方法对于所有对象而言都是一样的,没有必要每个对象都保存一个方法,只要由类的原型保存一份,各个对象使用方法的时候调用这些方法就可以了。
2.为什么要用原型来保存方法
因为方法对所有类对象来说都是一样的,如果用传统方式定义,那样每个类的对象被定义的时候,该对象都会保存这个方法的信息,这样会耗
费很多资源。而使用原型来保存,所有的方法都保存在原型中,每个对象需要使用方法的时候就调用原型对象中保存的方法。节省了资源。
在类中定义共享的共有方法,私有静态属性和方法,共有静态属性和方法。
//一种更为合适的公用属性和方法的定义,把共有方法在类第一次调用的时候加到类的原型对象中
var Book = function(name){
//公有属性,在构造方法里面来定义,通过this关键字
this.name = name;
//第一次执行该对象的构造方法,这个时候执行下面的代码
//为类的原型对象上定义共有的方法
//所有该类的对象共享相同的共有对象,减小了内存的消耗
if (typeof Book._init == "undefined") {//在第一次定义该类对象的时候会成立
//共有的方法,在原型对象上定义
Book.prototype.setName = function(nname) {
this.name = nname;
};
Book.prototype.getName = function(){
return this.name;
};
Book.prototype.getCount = function(){
addCount();
return count;
};
}
//类已经被定义过了,以后就不再重新定义原型对象上的方法了
Book._init = true;
//利用局部变量来模拟私有静态属性和方法
//这些局部变量定义出来的方法和属性外界不能直接访问,只能通过公有方法访问,
var count = 0;
var addCount = function(){
count++;
}
};
//定义共有静态属性
Book.staticValue = 10;
//定义共有的静态方法
Book.changeValue = function() {
Book.staticValue++;
}
对上面类的调用方法
//这个new操作相当于先创建了一个简单对象,调用了类的构造方法
var book1 = new Book("AJAX");
var book2 = new Book("AJAX1");
alert(book1.getName());
alert(book2.getName());
book1.setName("JAVA");
alert(book1.getName());
alert(book2.getName());
alert(book1.getCount());
alert(book2.getCount());
alert(book1.getCount());
//共有的静态属性和方法要用类名来调用
alert(Book.staticValue);
Book.changeValue();
alert(Book.staticValue);
定义一个对象,希望这个对象拥有一些自己独享的私有信息
方法:直接定义一个匿名的类
//一个单独的对象,期望拥有一些私有有的信息
下面的方法和上面的起到一样的效果,
//利用匿名方法直接调用的方式,来实现一个对象拥有私有的信息
var priObj = (function(name){
//由于这个变量是在方法内定义的,起到的效果就是私有的
var priname = name;
//这个格式要求返回的是一个对象,
//这个对象要求有getName和setName两个方法
return {
getName:function() {
return priname;
},
setName:function(nname) {
priname = nname;
}
};
})("wang");
下面是上面对象的使用方法
//var priObj1=new priObj("a");
//var priObj2=new priObj("b");
上面的做法是错误的,因为这个priObj已经是个定义好的对象了,在定义匿名类的同时就定义好的,所以不能再这么去new了。
//priObj.priname是私有内容,无法访问
alert(priObj.priname);
alert(priObj.getName());
priObj.setName("Lee");
alert(priObj.getName());
alert("");
1.为什么不用原型来创建属性
因为原型创建的内容是这个类所有对象所共享的,对于一个属性而言,不同的类的对象的值都不一样。如果使用原型对象来创建对象属性,那么任何一个类的对象修改了自己的某个属性,其他对象的相同属性也会被修改。
这么做的本质是因为:属性是各个对象不同的,要求对象自己保存自己该属性的值,而方法对于所有对象而言都是一样的,没有必要每个对象都保存一个方法,只要由类的原型保存一份,各个对象使用方法的时候调用这些方法就可以了。
2.为什么要用原型来保存方法
因为方法对所有类对象来说都是一样的,如果用传统方式定义,那样每个类的对象被定义的时候,该对象都会保存这个方法的信息,这样会耗
费很多资源。而使用原型来保存,所有的方法都保存在原型中,每个对象需要使用方法的时候就调用原型对象中保存的方法。节省了资源。
在类中定义共享的共有方法,私有静态属性和方法,共有静态属性和方法。
//一种更为合适的公用属性和方法的定义,把共有方法在类第一次调用的时候加到类的原型对象中
var Book = function(name){
//公有属性,在构造方法里面来定义,通过this关键字
this.name = name;
//第一次执行该对象的构造方法,这个时候执行下面的代码
//为类的原型对象上定义共有的方法
//所有该类的对象共享相同的共有对象,减小了内存的消耗
if (typeof Book._init == "undefined") {//在第一次定义该类对象的时候会成立
//共有的方法,在原型对象上定义
Book.prototype.setName = function(nname) {
this.name = nname;
};
Book.prototype.getName = function(){
return this.name;
};
Book.prototype.getCount = function(){
addCount();
return count;
};
}
//类已经被定义过了,以后就不再重新定义原型对象上的方法了
Book._init = true;
//利用局部变量来模拟私有静态属性和方法
//这些局部变量定义出来的方法和属性外界不能直接访问,只能通过公有方法访问,
var count = 0;
var addCount = function(){
count++;
}
};
//定义共有静态属性
Book.staticValue = 10;
//定义共有的静态方法
Book.changeValue = function() {
Book.staticValue++;
}
对上面类的调用方法
//这个new操作相当于先创建了一个简单对象,调用了类的构造方法
var book1 = new Book("AJAX");
var book2 = new Book("AJAX1");
alert(book1.getName());
alert(book2.getName());
book1.setName("JAVA");
alert(book1.getName());
alert(book2.getName());
alert(book1.getCount());
alert(book2.getCount());
alert(book1.getCount());
//共有的静态属性和方法要用类名来调用
alert(Book.staticValue);
Book.changeValue();
alert(Book.staticValue);
定义一个对象,希望这个对象拥有一些自己独享的私有信息
方法:直接定义一个匿名的类
//一个单独的对象,期望拥有一些私有有的信息
下面的方法和上面的起到一样的效果,
//利用匿名方法直接调用的方式,来实现一个对象拥有私有的信息
var priObj = (function(name){
//由于这个变量是在方法内定义的,起到的效果就是私有的
var priname = name;
//这个格式要求返回的是一个对象,
//这个对象要求有getName和setName两个方法
return {
getName:function() {
return priname;
},
setName:function(nname) {
priname = nname;
}
};
})("wang");
下面是上面对象的使用方法
//var priObj1=new priObj("a");
//var priObj2=new priObj("b");
上面的做法是错误的,因为这个priObj已经是个定义好的对象了,在定义匿名类的同时就定义好的,所以不能再这么去new了。
//priObj.priname是私有内容,无法访问
alert(priObj.priname);
alert(priObj.getName());
priObj.setName("Lee");
alert(priObj.getName());
alert("");