js 使用闭包封装数据

原创 2015年07月31日 09:59:42

像c++/java等高级语言都提供了 private 关键字使得数据的访问私有化,但是js并没有提供这一功能,如何实现呢?我们可以使用闭包模拟实现。

 


function Student(param_name,param_age){
    var m_name,m_age;

    this.setName = function(name){
        m_name  = name;
    };

    this.setAge = function(age){
        m_age = age;
    };

    this.getName = function(){
        return m_name;
    };

    this.getAge = function(){
        return m_age;
    };

    this.setName(param_name);
    this.setAge(param_age);
}


var stu = new Student('zhengjinwei',24);
console.log(stu.getName());
console.log(stu.getAge());

stu.setName('zjw');
stu.setAge(25);
console.log(stu.getName());
console.log(stu.getAge());

 

现在我们只能通过 暴露在外面的接口访问内部数据了,如果试图访问会得到 undefined

 

 

综合使用闭包:


var Student=(function(){

    var m_staticMaxAge = 120;//定义一个私有的静态属性

    function ageIsValid(age){ //定义一个私有的静态方法
        if(age > m_staticMaxAge){
            throw Error("the property age must be less than "+m_staticMaxAge);
        }
    }

    //返回构造函数,设置一些属性
    return function (name,age) {

        var m_name, m_age;//把私有属性都放到这里定义

        //私有属性的 setter 和 getter 都放到这里
        this.setName = function (name) {

            Student.nameIsValid(name);
            m_name = name;
        };

        this.setAge = function (age) {
            ageIsValid(age);
            m_age = age;
        };

        this.getName = function () {
            return m_name;
        };

        this.getAge = function () {
            return m_age;
        };

        this.setName(name);
        this.setAge(age);
    };
})();

//定义公有的方法
Student.prototype = {
    show:function(){
        console.log("showcall   name:"+this.getName()+" age:"+this.getAge());
    }
};

//定义静态的公有方法
Student.nameIsValid = function(name){
    if(typeof name != 'string'){
        throw  Error("property name must me a string value");
    }
};

//////////////////////////////////////////////////////////////////////////////




//正常调用
var stu = new Student('zhengjinwei',12);
console.log("name:"+stu.getName()+" age:"+stu.getAge());
stu.show();



//报name异常的调用
var stu2 = new Student(1212,12);
console.log("name:"+stu2.getName()+" age:"+stu2.getAge());
stu.show();


//报age异常的调用
var stu3 = new Student("zhengjinwei",121);
console.log("name:"+stu3.getName()+" age:"+stu3.getAge());
stu.show();



 

 


版权声明:技术博客自由转载,自由使用。

利用js的闭包原理做对象封装及调用

创建一个js文件,名为testClosure.js: (function () { function a() { alert('i am a'); } ...
  • wzj0808
  • wzj0808
  • 2017年03月01日 00:06
  • 2216

概念笔记之[javascript<-2->]闭包和封装

闭包简介闭包有很多用法,这种用法(在某个js文件中,把所有的代码括起来)主要目的是对代码进行封装(隔离)。 如果直接使用开放式的写法,在里面定义的变量和函数可能会对全局造成污染,也有可能受到全局定义...
  • sinat_28690417
  • sinat_28690417
  • 2016年12月06日 22:56
  • 216

JS 表单数据封装到后台的工具类

//工具 var Utils = { //通过表单得到数组 getArrayByForm : function (formId) { var arr = $(formId).serial...
  • Michaelwubo
  • Michaelwubo
  • 2016年03月09日 10:51
  • 1318

js闭包的用途(匿名自执行函数,缓存,实现封装,实现面向对象)

文章转载自:http://blog.csdn.net/sunlylorn/article/details/6534610
  • cl61917380
  • cl61917380
  • 2014年10月17日 14:10
  • 2461

js-闭包 代码多示例

/*var name = "The Window";       var object = {     name : "My Object",     getNameFunc : functio...
  • u010242159
  • u010242159
  • 2016年09月07日 18:40
  • 350

闭包对外暴露接口(2种)

经常使用JavaScript的同学应该注意过类似于下面这样结构的脚本语言 著名的第三方类库jQuery就是用到这样的语法,这个就叫做“自执行匿名函数” 第一次看到这样的语法的时候其...
  • muyue1990
  • muyue1990
  • 2017年02月04日 10:53
  • 767

JS封装类

JS封装类或对象的最佳方案       面向对象强大的优点之一是能够创建自己专用的类或者对象,封装一组属性和行为。抛开性能来说,JS要比面向对象语言如JAVA要灵活好用的多,组装数据结构很...
  • 99guo
  • 99guo
  • 2014年07月03日 17:06
  • 4447

利用js的闭包原理做对象封装及调用

创建一个js文件,名为testClosure.js: (function () { function a() { alert('i am a'); } ...
  • wzj0808
  • wzj0808
  • 2017年03月01日 00:06
  • 2216

js闭包的用途(匿名自执行函数,缓存,实现封装,实现面向对象)

文章转载自:http://blog.csdn.net/sunlylorn/article/details/6534610
  • cl61917380
  • cl61917380
  • 2014年10月17日 14:10
  • 2461

js-闭包 代码多示例

/*var name = "The Window";       var object = {     name : "My Object",     getNameFunc : functio...
  • u010242159
  • u010242159
  • 2016年09月07日 18:40
  • 350
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:js 使用闭包封装数据
举报原因:
原因补充:

(最多只允许输入30个字)