JavaScript 面向对象编程入门案例

来源:互联网 发布:java web项目相对路径 编辑:程序博客网 时间:2024/05/17 03:15

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:

 
所以,在JS中,不能用构造器的方式来给私有变量赋值。这是第二个不同点。
 
更正一下:
 
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

 
在JAVA中,某些属性和方法需要被设置成静态,比如Person类,可以设置一个静态的计数器icount,来获得当前所有对象的总数。
 
我们可以这么做
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);


运行结果:

 

 

 

 


 
 
总结:JS中没有private,public等面向对象语言专有的关键字,只能通过特殊的语法来模拟面向对象编程编程。
 

 


 

 

 

1 0
原创粉丝点击