JavaScript 面向对象编程入门案例

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等面向对象语言专有的关键字,只能通过特殊的语法来模拟面向对象编程编程。
 

 


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值