您的位置:首页 > Web前端 > JavaScript

JS学习笔记-OO疑问之封装

2016-03-04 21:08 465 查看
封装是面向对象的基础,今天所要学习的匿名函数与闭包就是为了实现JS的面向对象封装。封装实现、封装变量。提高数据、系统安全性。封装正是面向对象的基础。

一、匿名函数

即没有名字的函数。其创建方式为

function(){...}

单独存在的匿名函数,无法执行,可通过赋值给变量调用或通过表达式自我执行来实现执行。

1.赋值给变量为一般的函数使用方式

var run = function(){

return '方法执行中';

};

alert(run());

2.通过表达式自我运行

(function(arguments可选)

{

alert('方法执行中');

})(arguments);

二、闭包

在一个普通函数的内部。创建一个匿名函数,匿名函数可訪问普通函数中的变量。进而实现类似于面向对象中封装的特性,这个匿名函数就叫做相应普通函数的闭包。闭包就是对外创建的接口,通过接口达到訪问函数内部变量的效果。

functionrun()
{

var username
= 'Forrest';

return function () { //通过匿名函数返回 box()局部变量

return username;

};

}

//alert(username);
//错误username is
not defined

alert(run()());

特点:闭包中使用的局部变量会驻留在内存中,避免了使用全局变量造成的命名冲突等情况的发生。

值得注意的是闭包中使用thiskeyword。指向的是window对象。

三、封装

为了更好的安全性、数据保护。则须要对数据进行私有化的封装,而JS中没有块级作用域的概念(即出了{}的范围。仍能够訪问声明的变量),但有了前面的基础,我们就能够达到像其它正规面向对象语言的封装效果。

function user(){
(function(){
for(i = 0; i<5; i++){
alert(i);
}
})();
alert(i);                          //此处无法訪问变量i
}
//私有作用域取代全局变量
(function(){
var username= 'Forrest';
alert(username);
})();                                  //匿名函数运行完成后,变量马上销毁

//訪问私有变量
function User(){
var username= Forrest;            //私有变量
function learn(){                 //私有函数
return '学习中';
};

//对外提供接口。间接訪问内部成员
this.userlearn = function(){
return username + learn();
};
}
var user = new User()
alert(user.userlearn());

//实现get()、set()
function User(value){
var user = value;
this.getUser = function(){
return user;
}
this.setUser = function(value){
user = value;
}
}
var user = new User('Forrest');
alert(user.getUser());
user.setUser('Li');
alert(user.getUser());

//静态私有变量
(function(){
var user = '';
User = function(value){
user = value;
};
User.prototype.getUser = function(){
return user;
};
User.prototype.setUser = function(value){
user = value;
};
})();

//字面量方式的私有化
function NormalUser(){}
var user = function(){
var user = 'Forrest';
function learn(){
return user + '学习中...';
};
var nu = new NormalUser();
nu.userlearn = function(){
return learn();
};
return nu;
}();
alert(user.userlearn());


结语:

JS虽不是一门正统的面向对象的语言,但用它也能达到面向对象的封装、继承、多态等的效果。学习起来还是须要好好理解的,特别是对于使用JS不是特别多的人来说,仅仅能等到以后的逐步应用来解决这一系列的问题,更进一步体会它在面向对象方面的应用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: