JavaScript可以说是基于对象的语言,因为它不像其他面向对象的语言那样,有诸如private,public等等的关键字来定义一个类。
但是,JavaScript可以通过它特殊的语法来模拟面向对象语言的写法。
1.public
如果定义一个类,并且在类里添加属性。
在java中,我们常常这么写
public class Person {
public String name;
public String sex;
public Person(String name,String sex){
this.name = name;
this.sex = sex;
}
}
上面的代码中,定义了一个Person类,里面有两个属性name和sex,它们都是公共变量。
现在利用构造器,我们新建一个对象:
Person p1 = new Person("张三","男");
我们可以通过这个对象,拿到name和sex的值。
System.out.println(p1.name);
System.out.println(p1.sex);
运行结果:
张三
男
在JS中,没有专门的关键字来定义一个类,但是可以通过function的方式来定义一个构造器。
比如,我们可以这样来定义一个Person类的构造器:
function Person(name,sex){
this.name = name;
this.sex = sex;
}
在JS中,this的变量就相当于JAVA中的public成员变量,直接写在构造器里,不需要在构造器外边单独定义,这是第一个不同点。
我们通过下面的语句可以创建对象和弹出属性值:
var p1 = new Person("张三","男");
alert(p1.name+" "+p1.sex);
运行结果:
到目前为止,JS实现了类的定义和公共成员变量的访问。
2.private
那么,对于一个人而言,名字和性别公开的确没关系,可是对于一些比较敏感的信息,比如婚否,薪资等,是不能随便公开的,所以,JAVA中会把这些信息设置为私有属性。
像这样:
public class Person {
private String name;
private String sex;
public Person(String name,String sex){
this.name = name;
this.sex = sex;
}
}
只是这样的话,就需要响应的get和set方法来操作这些私有属性了,即便是JAVA,外部也无法直接访问这些属性。
像这样:
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
在外部通过公共方法来访问即可:
Person p1 = new Person("张三","男");
System.out.println(p1.getName());
System.out.println(p1.getSex());
运行结果:
张三
男
在JS中,没有private关键字,只能通过特殊的语法来模拟私有成员变量,如下:
function Person(p_name,p_sex){
var name = name;
var sex = sex;
this.getName = function(){
return name;
}
this.getSex = function(){
return sex;
}
}
var p1 = new Person("张三","男");
alert(p1.getName()+" "+p1.getSex());
没错,在JS中用var来模拟私有成员变量,这是通过作用域的概念来模拟的,在function里面的var变量,是局部变量。
遗憾的是,结果是弹出两个undefined:
function Person(){
var name;
var sex;
this.setName = function(p_name){
name = p_name;
}
this.setSex = function(p_sex){
sex = p_sex;
}
this.getName = function(){
return name;
}
this.getSex = function(){
return sex;
}
}
var p1 = new Person();
p1.setName('张三');
p1.setSex('男');
alert(p1.getName()+" "+p1.getSex());
运行结果:
3.static
public class Person {
public static int icount = 0;
public Person(String name,String sex){
icount ++; //每创建一个Person对象,计数器 + 1
}
}
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();
Person p3 = new Person();
Person p4 = new Person();
Person p5 = new Person();
Person p6 = new Person();
Person p7 = new Person();
System.out.println(Person.icount);
}
运行结果:
7
在JS中,就像这样给某个类添加静态属性:
//定义一个空构造器
function Person(){
Person.icount ++;
}
Person.icount = 0;
new Person();
new Person();
new Person();
new Person();
new Person();
new Person();
new Person();
alert(Person.icount);
运行结果: