在之前的博客中描述了Java中的面向对象三大特性—封装。由于JavaScript是基于对象的,Java是面向对象的语言,因此这两种语言有着类似的特性,但是在js中没有封装这一概念只能是去模拟封装;
封装
基本理念和Java相同,出于安全性等考虑,将内部的某一属性封装起来,外界不能直接操纵这个属性,只能通过开放的方法进行赋值或者取值;而这个公开的部分就称为对象的界面。
接下来上代码,逐步的了解在js中封装的必要性;
1:阴云密布—–默认正确
function Person(name,age){
this.name = name;
this.age = age;
this.say = function(){
console.log(this.name + ":" + this.age);
}
}
var p1 = new Person("lisi",22);
p1.say();//输出lisi:22
上述代码中定义了一个Person类,中有两个属性和一个方法,在之后的创建对象中赋了两个值,之后调用方法。在这里默认逻辑正确,因此没有任何错误;
2:晴空霹雳——出现问题
function Person(name,age){
this.name = name;
this.age = age;
this.say = function(){
console.log(this.name + ":" + this.age);
}
}
var p1 = new Person("lisi",1000);
p1.say();//输出lisi:1000
此时如果将年龄误输入为1000,那么程序依然会忠诚的将1000输出,而并没有管他符不符合现实要求。
3:回光返照—–逻辑判断
function Person(name,age){
this.name = name;
if(age > 100 || age < 0){
this.age = 18;
}else{
this.age = age;
}
this.say = function(){
console.log(this.name + ":" + this.age);
}
}
var p1 = new Person("lisi",1000);
p1.say();//输出lisi:18
此时在输入age时会进行逻辑判断,如果age不符合就直接赋值18;符合就使用传进来的值;进行到这一步感觉已经解决了这个问题??
3:全面爆发——-功亏一篑
function Person(name,age){
this.name = name;
if(age > 100 || age < 0){
this.age = 18;
}else{
this.age = age;
}
this.say = function(){
console.log(this.name + ":" + this.age);
}
}
var p1 = new Person();
p1.name = "lisi";
p1.age = 1000;
p1.say();//输出lisi:1000
上述代码中我没有在创建Person对象的时候直接传进去参数,我使用的是点符号法,因为age属性此时仍然是Person对象的属性,我依旧可以通过这种方式直接对age进行赋值,直接避开了程序中的逻辑判断!!!!
那岂不是麻了爪?接下来我该怎么办?
4:大道至上——封装奥义
function Person(name){
this.name = name;
var age;
this.getAge = function(){
if(true){
return age;
}else{
return 18;
}
}
this.setAge = function(num){
if(num > 100 || num < 0){
age = num;
}else{
age = num;
}
};
this.say = function(){
console.log(this.name);
}
}
var p1 = new Person("lisi");
p1.setAge(24);
p1.say();//输出lisi
console.log(p1.getAge());//输出24
如上述代码,在Person类中有一个实例化对象属性name。注意这里的age已经不是一个实例化对象属性,也不是类的属性;他是一个使用var声明的变量,而且age的作用域只在function Person中。因此这个age就称之为被封装的属性,而为了让外界一定程度上能够操作age就在function Person内部设置了两个实例化对象函数分别是getAge()和setAge();当Person实例化出对象时,使用p1是无法直接调用age变量的,只能通过实例化函数来进行操作;在这两个函数中又有着相应的逻辑判断;
1:getAge() 在这个方法中需要一个判断法则,看我是否可以直接返回真实年龄,在这里简略的将判断法则设置为通过(true);
2:setAge(num) 在实例化对象调用这个方法时,传入参数,内部有相应的判断逻辑检测age是否符合既定标准;
将一些不想被外界直接操作的属性封装起来,外界没办法直接调用操作,只能通过设置好的界面(实例方法)进行操作,因此极大地保证了安全性也降低了耦合度;
最后的总结
1:js封装的思想和Java封装的思想都是一致的;
2:在js中的function类中使用var修饰一个变量和在Java中使用private修饰一个变量作用是一样的,这个时候外界都没有办法继续调用;
3:js和Java是相通的,不能只为学习一个知识点而学习这个知识点,触类旁通,总结概括,总结思想,找到异同才是最快的方法;
最后的话:
如果你感到焦躁,无助,失望,愤怒。那只有一个原因,你没有去脚踏实地的去做当前的事,沉下心去,做好当前事,别想太多,这才是最快的方式;