二分之一

Just Jason's Blog

通过匿名函数实现JS的代码封装(类封装)

JS没有严格的类似JAVA的类概念,但可以通过原型链实现类。

通常意义上,推荐使用在构造函数中接受属性值,在原型链上注册方法属性。详情可参考《JavaScript高级程序设计(第2版)》

类似以下代码:

var myClass = function(a, b, c){
    this.a = a;
    this.b = b;
    this.c = c;
    // 构造函数
}

myClass.prototype = {
    f1: function(){alert(this.a);},
    f2: function(){alert(this.b);},
    f2: function(){alert(this.c);}
    //该类的方法
}
var classA = new myClass(1,2,3);
classA.f1();

匿名函数

顾名思义,匿名函数就是没有实际名字的函数。

大家知道小括号的作用吗?小括号能把我们的表达式组合分块,并且每一块,也就是每一对小括号,都有一个返回值。这个返回值实际上也就是小括号中表达式的返回值。所以,当我们用一对小括号把匿名函数括起来的时候,实际上小括号对返回的,就是一个匿名函数的Function对象。因此,小括号对加上匿名函数就如同有名字的函数般被我们取得它的引用位置了。所以如果在这个引用变量后面再加上参数列表,就会实现普通函数的调用形式。

(function(){alert(“匿名函数”);});

但小括号返回的仅是函数表达式,函数并没有运行起来。要运行函数表达式在后再再加上();

变成 (function(){alert(“匿名函数”);})();

这样就产生了一个困扰,这样写会产生闭包吗?大家都知道闭包对于GC的垃圾回收机制有影响,建议少用闭包。

下面我们就来探讨一下。

以我的理解来说吧。是否应用了闭包特性,必须确定该段代码有没有最重要的要素:未销毁的局部变量。

只能说这种写法有闭包的特性,只否形成闭包,还要看有没有未销毁的局部变量。

匿名函数封装类

(function(){

    var myClass = function(a, b, c){
        this.a = a;
        this.b = b;
        this.c = c;
        // 构造函数
    }

    myClass.prototype = {
        f1: function(){alert(this.a);},
        f2: function(){alert(this.b);},
        f2: function(){alert(this.c);}
        //该类的方法
    }

    window.myClass = myClass;
})();
var classA = new myClass(1,2,3);
var classB = new myClass(10,20,30);
classA.f1();
classB.f1();

其中window.myClass = myClass;这一段,也可以使用return 抛可供调用的API接口。

最后修改时间:2014年9月8日星期一晚上8点57